У меня есть программа на C, скомпилированная с gcc на Ubuntu x86.Это функция, которую я вызываю с main
void addme()
{
long a = 5;
char c = '3';
long array[3];
array[0] = 2;
array[1] = 4;
array[2] = 8;
}
Если я прерваюсь на последней строке и отлаживаю / проверяю, это то, что я получаю
(gdb) print &a
$5 = (long *) 0xbffff04c
(gdb) print &c
$6 = 0xbffff04b "3\005"
(gdb) print &array
$7 = (long (*)[3]) 0xbffff03c
(gdb) x 0xbffff03c
0xbffff03c: 0x00000002
(gdb) x 0xbffff040
0xbffff040: 0x00000004
(gdb) x 0xbffff044
0xbffff044: 0x00000008
(gdb) x 0xbffff04c
0xbffff04c: 0x00000005
Почему 0xbffff048, 0xbffff049, 0xbffff04a и 0xbffff04b зарезервированы для символа c
, когда для хранения символа требуется только 0xbffff04b?
Кроме того, что означает это обозначение "3\005"
?
С другой стороны, если мой методкак показано ниже, для символа с тремя дополнительными байтами памяти заполнение отсутствует
void addme()
{
long a = 5;
char c = '3';
char line[9];
char d = '4';
}
Так выглядит распределение памяти для этих переменных (пропуская ведущую часть адреса)
a - f04c
c - f04b
d - f04a
line - f041, f042, f043, f044, f045, f046, f047, f048, f049
Также не уверен, почему d
был поднят выше line
в резервировании памяти.Я предполагаю, потому что это не было инициализировано, это идет в другую область в стеке чем инициализированные переменные?