gpt4 book ai didi

c - 为什么 gcc 在两次成功分配之间留下 16 个字节?

转载 作者:太空宇宙 更新时间:2023-11-04 05:56:39 25 4
gpt4 key购买 nike

我有以下代码

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)

虽然ab 都是字符指针。为什么指向 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com