Я скомпилировал приведенный ниже код с помощью cygwin GCC на компьютере x64:
gcc main.c -o main
(main.c)
long long mango = 13; // I also tried `char`, `short`, `int`
long melon = 2001;
void main()
{
}
Затем я сбрасываю значения символов с помощью nm
:
./main:0000000100402010 D mango
./main:0000000100402018 D melon
Как я понимаю, значение символа просто означает его адрес. Таким образом, адрес для mango
равен 100402010
. И melon
имеет адрес 100402018
. Так что mango
должен занимать 8 байтов.
Я пробовал другие типы для mango
, такие как char
, int
, short
. Он всегда занят 8 байтами.
Почему размер не меняется?
ADD 1
Спасибо за комментарий.
Я только что попробовал ниже код:
typedef struct{
char a1;
char a2;
char a3;
char a4;
char a5;
} MyStruct;
MyStruct MyObj1={1,2,3,4,5};
MyStruct MyObj2={1,2,3,4,5};
long long mango = 13;
long melon = 2001;
void main()
{
}
И на этот раз nm
показывает мне это:
./main:0000000100402020 D mango
./main:0000000100402028 D melon
./main:0000000100402010 D MyObj1
./main:0000000100402015 D MyObj2
MyObj1
и MyObj2
разделены 5 байтами. Так что компилятор действительно должен решить заполнение.