Почему я не могу проверить размер структуры в C? (необъявленная ошибка)

#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 before p в 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 является псевдонимом для другого целочисленного типа