为什么 malloc(1) 可以存储 4 字节整数?

cpr*_*mer 6 c memory malloc

据我了解,malloc(x) 返回一个 x 字节长的内存块。

因此,要存储 4 字节整数,我会这样做:

int *p = (int *)malloc(4);
*p = 100;
Run Code Online (Sandbox Code Playgroud)

因为 sizeof(int) 对我返回 4 。

但是,如果我这样做:

int *p = (int *)malloc(1);
*p = 100;
Run Code Online (Sandbox Code Playgroud)

它的工作原理似乎完全相同,存储值没有问题。

为什么使用 malloc() 请求的内存量似乎并不重要?4 字节整数不应该需要 malloc(4) 吗?

Wer*_*nze 5

如果这在您的情况下有效,那么它只是偶然有效,并不能保证有效。这是未定义的行为(比较这个SO问题),一切都可能发生。

您预计会发生什么?你的程序崩溃了?

malloc如果你打电话得更free频繁一些,这种情况仍然可能发生。malloc通常需要比请求多一些字节,并使用额外的空间进行管理(所有内存块的链接列表、内存块的大小)。如果您在分配的块之前或之后写入一些字节,那么您很可能会弄乱内部管理结构,并且随后的操作malloc将会free崩溃。

如果 malloc 内部总是分配至少 n 个字节,那么只有在访问字节 n+1 时,程序才可能崩溃。此外,操作系统通常仅基于页面来保护内存。如果页面大小为 512 字节,并且您的 malloc 字节位于页面中间,那么您的进程可能能够读写该页面的其余部分,并且只会在访问下一个内存页面时崩溃。但请记住:即使这有效,它也是未定义的行为。