2014-07-04 4 views
-1
#include <stdio.h> 
#pragma pack(1) 

typedef struct 
{ 
    char name[10]; 
    int age; 
    int class; 
    char grade; 
}stud_s; 

int main(void) 
{ 
    stud_s s1= {"john" ,10, 10, 'A'}; 
    printf("%ld \n",sizeof(stud_s)); 
    return 0; 
} 

В вышеуказанной структуре имя зарезервировано 10 байт. И имя «john» равно 4 байтам, поэтому, когда я использую #pragma, размер структуры должен быть 13. Вместо этого размер привел к 19 байтам. Может ли кто-нибудь взглянуть на мой код? Любая помощь будет оценена по достоинству.Что происходит, когда мы используем прагма-пакет (1)?

+1

Потому что 10 + 4 + 4 + 1 = 19 (по крайней мере, в моей поездке через академию). Размер структуры устанавливается при * компиляции * времени; нет * пробег * время. Упаковано или нет, не имеет никакого значения в этом факте. – WhozCraig

+0

@WhozCraig: путаница заключается в том, что они думают, что, поскольку «john» 'всего 4 байта (а это не так), тогда они будут сохранять 6 байтов в' stud_s :: name'. Таким образом, '19 - 6 = 13', как было предложено в вопросе. –

+0

В этом случае то, что я должен сделать, получает размер структуры как 13. – user3770743

ответ

0

Вы немного смущены относительно того, что делает pragma pack. Он не заботится о конкретном экземпляре, но о дополнении между элементами.

Давайте посмотрим на более простом объекте:

struct obj { 
    uint64_t x; 
    uint32_t y; 
}; 

Обычно, этот объект будет принимать 16 байт. Если вы используете pragma pack(1), он будет использовать только 12 байт.

0

В C невозможно определить структуру, содержащую массив, размер которого зависит от содержимого инициализатора. Вы можете использовать член гибкого массива C99, но тогда вам придется выделять структуру, используя malloc.

В C++ вы могли бы сделать что-то умное с шаблонами и наследованием, но тогда член name не был бы частью базового типа, что было бы неудобно.

В любом случае #pragma pack справка. Это общее расширение удаляет только отступы между полями.

Смежные вопросы