Имеет ли sizeof (* указатель структуры) значение структуры - PullRequest
0 голосов
/ 09 мая 2018

У меня есть такая структура Какой будет вывод функции sizeof.

struct sample
{
    int a;
    char b;
};

struct sample obj;
struct sample * ptr;

sizeof(*ptr);

Я попробовал этот кусок кода на C, используя компилятор gcc, и это дало мне размер самой структуры. Но я сомневаюсь, что это даст тот же результат при попытке с другими компиляторами C, а также с C ++.

Не могли бы вы помочь мне в этом.

Заранее спасибо.

1 Ответ

0 голосов
/ 09 мая 2018

Я попробовал этот кусок кода на C, используя компилятор gcc, и это дало мне размер самой структуры

Как и должно быть. Аргументом унарного оператора sizeof может быть либо выражение, либо имя типа в скобках. Все выражения в C имеют тип. И что подразумевается под sizeof, так это посмотреть на тип, который будет вычислять выражение, и указать размер этого типа.

Поскольку *ptr является выражением типа struct sample, результатом должен быть размер struct sample. Также стоит отметить, что обычно выражение даже не нужно оценивать, размер можно определять статически (если только вы не имеете дело с VLA).

Вы можете положиться на это поведение, потому что это то, что стандарт C указывает, что он должен делать. Это всегда даст размер структуры. Вы не можете полагаться на одинаковый размер во всех компиляторах, но вы можете быть уверены в поведении, которое будет иметь sizeof.

Поскольку в вашем собственном примере используются указатели, одно место, где это поведение может быть полезным, описано в «Я разыгрываю результат malloc?» , где вы должны указать malloc размер разыменованный указатель вместо типа:

struct sample * ptr = malloc(sizeof *ptr);

Смысл в том, что вам не нужно повторять имя типа дважды (трижды в C ++, где вам также понадобится приведение), что поможет вам избежать тонких ошибок, которые могут возникнуть при рефакторинге.

...