2011年3月1日 星期二

C語言- 指標變數 (pointer variable)

/* 永遠不要忘記,一個指標變數無論其TYPE如何,指標變數的大小只會等於4bytes,  sizeof(指標變數) = 4 bytes */


EX.
typedef struct eTable_s
{
qlink_t link;
eEntry_t e_entry;
logEntry_t *logTable;
logEntry_t *log_next;
int32 log_qcnt;
} eTable_t;


eTable_t *bpt = NULL;  /* 指標變數的初始值,給他NULL */

bpt's size = 4 bytes

sizeof(eTable_t) == 246 (bytes)
sizeof(bpt) == 4 (bytes)

如果想要把bp malloc的空間給清成0,如果寫成memset(bpt,0,sizeof(bpt));
則因為sizeof(bpt)==4 bytes. 所以後面如果用到bpt->logTable時後則可能會取得!=NULL的value;

正確用法是 memset(bpt,0,sizeof(eTable_t));


Q2: 那為什麼寫 memset(bpt->logTable,0,sizeof(bpt->logTalble))
則bp->logTable 仍有可能不是NULL??

因為memset是把bp->logTable這個「指標變數」「指到」的地方清成0[補充1],而不是bp->logTable這個指標變數清成0
/* 可參考memset的macro function */

正確寫法應該是 bpt->logTable = NULL;

更多指標變數用法,說明,範例:
http://squall.cs.ntou.edu.tw/cprog/Materials/Pointers.html
http://nknucc.nknu.edu.tw/~jwu/c/cpgch4.htm
http://www.wretch.cc/blog/rave30822/12674500





[補充1] memset的用法:

memset( buf, '0', 6 )
的意思就是:
把從 buf 指向的地址開始的 6 個字節的內容置為 '0' 。


Reference:
http://www.lslnet.com/linux/f/docs1/i42/big5296913.htm
http://tw.myblog.yahoo.com/jw!C8o78amGHxpmt7niVSLKqfN4pg--/article?mid=46





[補充2] 幾個容易混淆的 pointer宣告與大小

請問以下宣告pointer佔多少bytes, 假設 1 pointer: 4bytes
0) char *x;
1) char **a;             //This is a pointer to a pointer to char
2) char *b[20];      //This is an array of 20 pointers to char.
3) char (*c)[20];    //This is a pointer to an array of 20 chars.
4) char (*d)[20][40];


Ans: sizeof(x):4,sizeof(a):4,sizeof(b):80,sizeof(c):4,sizeof(d):4

引用自: http://eeepage.info/pointer-size/