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

标签 c gcc

我有以下代码

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/

相关文章:

c++ - gcc - 在一个命令中链接和编译

c - 发送带有修改报头的 TCP 段

计算数组中的排序问题

c - 为一些功能预加载我的库,同时使用其他人使用 LD_PRELOAD 的原始库

c++ - vector 空 Push_back 在 '{' 标记之前调用预期的主表达式

c++11 STL 的 binomial_distribution 极慢

c++ - MSVC 2008 16 字节结构成员对齐异常

macos - 操作系统 X 10.10。 Yosemite Clang 和 GCC 版本

c - 无法连接到 gpsd

从 INTEGER 到 int 的代码生成