我有以下代码
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 需要为任何基本类型1 返回充分对齐的内存。
在你的例子中,对齐似乎是在 16 字节的边界上。这应该满足任何基本类型的对齐要求。
1(引自:ISO/IEC 9899:201x 7.22.3 内存管理功能1)
这
如果分配成功则返回的指针适当对齐,以便可以将其分配给
指向具有基本对齐要求的任何类型对象的指针,然后使用
在分配的空间中访问此类对象或此类对象的数组(直到空间
被显式释放)。
关于c - 为什么 gcc 在两次成功分配之间留下 16 个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26322666/