2011年3月4日 星期五
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/
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/
訂閱:
文章 (Atom)