C語言---Clean結構體部分成員
阿新 • • 發佈:2020-12-12
技術標籤:C
Clean結構體部分成員
在C語言中,結構體是一個重要的資料結構,使用結構體可以表示一個物件的很多屬性,並且結構體也是實現連結串列的重要資料結構,在使用結構體的成員之前對成員變數進行清空操作,是保證資料不會出錯的好習慣,但是有時候結構體的成員裡面已經儲存了很多已經寫入的引數,那麼怎麼能夠避免,這些引數不會被勿清空呢?
接下來就通過一個小例子,來看看其中一種方法進行清空操作:
#include<stdio.h>
#include <string.h>
typedef int (*add)(int ia,int ib);
typedef int (* mal)(int ia,int ib);
typedef struct s_node{
add pAdd;
mal pMal;
int init;
int a;
int b;
int c;
char *buf;
int d;
}S_NODE,*PS_NODE;
int iadd(int ia,int ib){
return (ia+ib);
}
int imal(int ia,int ib){
return (ia*ib);
}
#define FIELD_OFFSET(type,field) ((unsigned int)&(((type *)0)->field))
int main(void){
S_NODE sVal;
sVal.pAdd = iadd;
sVal.pMal = imal;
sVal.a=9;
sVal.b=10;
sVal.c=12;
sVal.d=15;
sVal.buf="hello";
printf("memset before\n");
printf("a=%d,b=%d,c=%d,d=%d\n",sVal.a,sVal.b,sVal.c,sVal.d);
printf("buf:%s\n" ,sVal.buf);
printf("iadd:%d,imal:%d\n",sVal.pAdd(2,3),sVal.pMal(3,4));
unsigned int init_offset=FIELD_OFFSET(S_NODE,init);
printf("offset:%d\n",init_offset);
int size = sizeof(sVal) - init_offset;
printf("size:%d\n",size);
memset(((void *)(&sVal)+init_offset),0,size);
printf("memset after\n");
printf("a=%d,b=%d,c=%d,d=%d\n",sVal.a,sVal.b,sVal.c,sVal.d);
printf("buf:%s\n",sVal.buf);
printf("iadd:%d,imal:%d\n",sVal.pAdd(2,3),sVal.pMal(3,4));
return 0;
}
在上面的demon code裡面,結構體的頭部是函式指標,儲存的對應的函式,那麼為了不勿清空函式指標的前提下,把後面的變數進行清空,就需要使用code裡面定義的巨集,計算出偏移量,然後通過把結構體變數首地址偏移後,進行清空就OK了,看看執行結果
已經達到了預期的效果。