#c #struct #sizeof
#c #структура #размер
Вопрос:
Я пытаюсь выяснить sizeof(p)
, где p
struct
определено ниже; но, когда я пытаюсь запустить следующий код:
#include <stdio.h>
struct p
{
char x;
int y;
};
int main()
{
printf("%d", sizeof(p));
return 0;
}
Я получаю эту ошибку:
main.c: In function ‘main’:
main.c:19:25: error: ‘p’ undeclared (first use in this function)
printf("%d", sizeof(p));
^
Я новичок в C, и я попытался переместить p
определение в main
функцию, изменив определение p
, поиск ошибки в Интернете (ни одно из сообщений с той же ошибкой не ответило на мой вопрос) И т. Д., Но, Похоже, я не смог заставить его работать. Любые предложения приветствуются.
Комментарии:
1.
sizeof (struct p)
и использоватьprintf ("sizeof struct p: %zun", sizeof (struct p));
(напримерp
, это имя тега структуры, а не объявленный экземпляр структуры, поэтому для определения размера типаstruct p
должен использоваться весь тип и заключаться в круглые скобки)2. Вы также можете определить свою структуру следующим образом: typedef struct { char x;int y;} p; и тогда sizeof(p) должен работать. Это поведение отличается между C и C , поэтому оно может сбивать с толку
3. ах, спасибо, что работает! Если бы кто-нибудь мог добавить это в качестве ответа, который я приму, я понятия не имел, что упускаю что-то настолько простое. Кстати, почему вам нужно сказать
struct
beforep
вsizeof
вызове?
Ответ №1:
В C (в отличие от C ) struct p...
конструкция не определяет новый тип переменной. Он определяется только p
как определенный тип struct
. Итак, чтобы получить размер этой структуры или объявить переменную этого типа, вам нужно использовать struct p
для ссылки на нее.
Вот так:
#include <stdio.h>
struct p {
char x;
int y;
};
int main()
{
printf("%zun", sizeof(struct p));
// Alternatively ...
struct p q;
printf("%zun", sizeof(q));
return 0;
}
Также обратите внимание, что вы должны использовать спецификатор %zu
формата для size_t
типа.
Комментарии:
1. Хм, я просто просматривал спецификатор
%zu
формата, я видел, что он упоминалсяsize_t
, поэтому C имеет свой собственный тип данныхsize_t
для хранения структурыsizeof
данных?2. @JohnD Да. Смотрите здесь .
3. Вероятно, это относится к другому вопросу, но, поскольку он, вероятно, тривиален, выводимый им ответ
8
вместо5
(разве это не должен быть1
байт изchar x
и4
байт изint y
). Это ошибка в приведенном выше коде или это из-за заполнения? Заполняют ли структурыchar x
до 4 байт из 1 байта?4. @JohnD Да, снова. Структура дополнена (по умолчанию), так что
int
элемент выровнен по 4-байтовой границе. Вы можете отключить это в большинстве компиляторов или изменить размер заполнения.5.
size_t
является псевдонимом для другого целочисленного типа