1. 程式人生 > 其它 >C語言---Clean結構體部分成員

C語言---Clean結構體部分成員

技術標籤: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了,看看執行結果
在這裡插入圖片描述
已經達到了預期的效果。