Я попробовал этот кусок кода на C, используя компилятор gcc, и это дало мне размер самой структуры
Как и должно быть. Аргументом унарного оператора sizeof
может быть либо выражение, либо имя типа в скобках. Все выражения в C имеют тип. И что подразумевается под sizeof
, так это посмотреть на тип, который будет вычислять выражение, и указать размер этого типа.
Поскольку *ptr
является выражением типа struct sample
, результатом должен быть размер struct sample
. Также стоит отметить, что обычно выражение даже не нужно оценивать, размер можно определять статически (если только вы не имеете дело с VLA).
Вы можете положиться на это поведение, потому что это то, что стандарт C указывает, что он должен делать. Это всегда даст размер структуры. Вы не можете полагаться на одинаковый размер во всех компиляторах, но вы можете быть уверены в поведении, которое будет иметь sizeof
.
Поскольку в вашем собственном примере используются указатели, одно место, где это поведение может быть полезным, описано в «Я разыгрываю результат malloc?» , где вы должны указать malloc
размер разыменованный указатель вместо типа:
struct sample * ptr = malloc(sizeof *ptr);
Смысл в том, что вам не нужно повторять имя типа дважды (трижды в C ++, где вам также понадобится приведение), что поможет вам избежать тонких ошибок, которые могут возникнуть при рефакторинге.