2014-09-12 2 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' является узлом. –

+0

Как указано выше. '* n2' указывает на то, что указывает' n2', а не «адрес, куда указывает n2». Фактически значение 'n2' само по себе является« адресом, где n2 указывает », потому что' n2' является указателем. – davmac

+0

Иногда полезно писать 'sizeof * n2', чтобы напомнить себе, что' sizeof' - это оператор, а не функция. Кроме того, это хороший стиль. –

ответ

13

Вы должны понять две вещи:

Во-первых, что тип *n2? Тип n2 является указателем на node, поэтому тип *n2 - node.

Во-вторых, вы правы n2 указатель danging, он не указывает на действительное место, но магия sizeof есть, это время оператор компиляции (кроме случаев, когда операнд является переменной массива длины C99), sizeof(*n2) оценивается так же, как sizeof(node) во время компиляции.

+0

Хорошо с подчеркиванием оператора времени компиляции. –

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.