2014-09-12 68 views
3

在下面的代碼:爲什麼的sizeof(*節點)賦予這個結構的大小,而不是大小的指針

typedef struct{int data1; int data2} node; 
node n1; 
node* n2; 

sizeof(n1) returns 8 // size of the struct node 
sizeof(n2) returns 4 // since n2 is a pointer it returns the size of the pointer 
sizeof(*n2) returns 8 // HOW DOES THIS WORK ? 

怎樣的sizeof實際工作?在上面的例子中,* n2歸結爲提供n2指向的地址。在這種情況下,n2仍然是一個懸掛指針,因爲我們既沒有分配內存,也沒有將它指向某個有效地址。它如何正確地給出結構的大小?

+2

「* n2歸結爲提供n2指向的地址」不正確。 'n2'是指向節點的指針,'n2'的值是節點的地址,'* n2'是節點。 – 2014-09-12 12:30:39

+0

根據以上評論。 '* n2'表示'n2'指向的內容,而不是「n2指向​​的地址」。實際上'n2'本身的值是「n2指向​​的地址」,因爲'n2'是一個指針。 – davmac 2014-09-12 12:38:05

+0

編寫'sizeof * n2'來提醒自己sizeof'是一個操作符,而不是一個函數。另外,它是很好的風格。 – 2014-09-12 12:51:47

回答

13

你需要明白兩兩件事:

首先,什麼是的*n2類型? n2的類型是指向node的指針,因此*n2的類型是node

其次,你是對的n2是danging指針,它並不指向有效的地方,但sizeof神奇的是,這是一個編譯時操作(除了當操作數是C99變長數組),sizeof(*n2)的編譯時間與sizeof(node)相同。

+0

強調編譯時操作符。 – 2014-09-12 12:32:51

1

當你這樣做*n2,其中n2被定義爲node* n2你基本上它告訴給在地址n2讀取數據,如果它有型node

在那個地址寫什麼並不重要。考慮加入這幾行例子:

void *n3 = n2; // copies the address, but no information about the data there 
int *n4 = (int *)n3; // again, copies the address 

sizeof(*n4) returns sizeof(int) 

所以基本上,總結一下,如果您有:

X* a; 
sizeof(a); // will always return 4, the size of a pointer 
sizeof(*a); // will always return sizeof(X), no matter if the address is set. 
2

基本上,你可以閱讀*n2爲「即N2所指向的東西」。

n2指向的是一個節點,節點的大小是8.很簡單... 無論它是否被分配都沒關係:n2是什麼類型指向的是一個節點,節點的大小爲8.

相關問題