我有以下代碼爲什麼gcc在2次成功分配之間留下16個字節?
void foo()
{
char *a, *b;
int *c, *d;
a = (char*)malloc(1);
b = (char*)malloc(1);
c = (int*)malloc(4);
d = (int*)malloc(4);
*a = 10;
*b = 20;
*c = 30;
*d = 40;
}
下面是GDB輸出:
13 a = (char*)malloc(1);
(gdb) n
14 b = (char*)malloc(1);
(gdb) n
15 c = (int*)malloc(4);
(gdb) n
16 d = (int*)malloc(4);
(gdb) n
17 *a = 10;
(gdb) n
18 *b = 20;
(gdb) n
19 *c = 30;
(gdb) n
20 *d = 40;
(gdb) n
21 }
(gdb) p a
$1 = 0x804b008 "\n"
(gdb) p b
$2 = 0x804b018 "\024"
(gdb) x/40b a
0x804b008: 10 0 0 0 0 0 0 0
0x804b010: 0 0 0 0 17 0 0 0
0x804b018: 20 0 0 0 0 0 0 0
0x804b020: 0 0 0 0 17 0 0 0
0x804b028: 30 0 0 0 0 0 0 0
(gdb)
雖然a
和b
都是字符指針。爲什麼指向b
的指針等於a + 16
?任何抵消16字節的原因?
這是必要的,因爲每個分配必須足夠好地對齊以用於任何用途。另外,通常會在控制信息附近提供給您的指針,該信息描述了傳遞的數據段。最後,請注意,這是由'malloc()'的C庫實現控制的,而不是由C編譯器本身控制。當然,這兩者密切相關。 – 2014-10-12 06:58:50
您不應該使用'malloc()'的返回值。請參閱http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc – pmg 2014-10-12 08:30:03
@Parth Shah系統上的sizeof(int *)是什麼? – 2501 2014-10-12 10:53:14