Разница между sizeof (* ptr) и sizeof (struct) - PullRequest
4 голосов
/ 13 октября 2011

Я попробовал следующую программу

struct temp{
   int ab;
   int cd;
};

int main(int argc, char **argv)
{
   struct temp *ptr1;
   printf("Sizeof(struct temp)= %d\n", sizeof(struct temp));
   printf("Sizeof(*ptr1)= %d\n", sizeof(*ptr1));
   return 0;
}

Вывод

Sizeof(struct temp)= 8
Sizeof(*ptr1)= 8

В Linux я наблюдал во многих местах использование sizeof(*pointer).Если оба одинаковы, почему используется sizeof(*pointer) ??

Ответы [ 2 ]

13 голосов
/ 13 октября 2011

Я обычно предпочитаю sizeof(*ptr), потому что если вы позже вернетесь и измените свой код таким образом, чтобы ptr теперь имел другой тип, вам не нужно обновлять sizeof.На практике вы можете изменить тип ptr, не осознавая, что на несколько строк ниже вы берете размер структуры.Если вы не указали тип избыточно, у вас будет меньше шансов испортить его, если вам понадобится изменить его позже.

В этом смысле это один из тех «код для удобства обслуживания» или «защитный код»такие вещи.

У других могут быть свои субъективные причины.Это часто меньше символов, чтобы напечатать.: -)

1 голос
/ 13 октября 2011

sizeof работает одним из двух способов: 1) с типом, 2) с выражением.Последний случай идентичен вызову sizeof для типа выражения.

Таким образом, вы можете написать это:

int a;

char p[sizeof(int)];
char q[sizeof a];

Оба означают одно и то же.

Утилита версии выражения для объявления указателя на динамическую память состоит в том, что вам нужно указать тип только один раз:

complex_type * pc = malloc(sizeof(*pc) * 100); // room for 100 elements

Если позже вы решите изменить тип *pc, у вас есть толькоизменить код в одном месте.

...