c - 为什么 malloc(1) 用于存储 4 字节整数?

标签 c memory malloc

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

所以要存储一个 4 字节整数,我会这样做:

int *p = (int *)malloc(4);
*p = 100;

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

但是,如果我这样做:

int *p = (int *)malloc(1);
*p = 100;

它的工作方式似乎完全一样,存储值没有问题。

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

最佳答案

如果这在您的情况下有效,它只是偶然有效并且不能保证有效。这是未定义的行为(比较 this SO question ),一切皆有可能。

您期望发生什么?你的程序崩溃了?

如果您更频繁地调用 mallocfree,这种情况仍可能发生。 malloc 通常会比请求多占用一些字节,并将额外的空间用于管理(所有内存块的链表、内存块的大小)。如果您在分配的 block 之前或之后写入一些字节,那么您很可能会弄乱内部管理结构,并且 free 的后续 malloc 将崩溃。

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

关于c - 为什么 malloc(1) 用于存储 4 字节整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41822904/

相关文章:

无法从 'void *' 转换为 'node *'

c++ - Linux 中是否有任何 C/C++ 编辑器在键入时显示错误

c - 如何在不使用 C 语言中的整数类型的情况下将 2 uint8 模乘一个大数

C#:对象的内存使用情况

memory - Vulkan 的 VkAllocationCallbacks 使用 malloc/free() 实现

c - 释放指向字符数组的指针的内存

c - scanf() 没有返回正确数量的参数

java - C、C++ 和 Java 中的不同结果相同的表达式。为什么?

mysql - 我应该使用 MEMORY (HEAP) 引擎还是 MyISAM 引擎创建 Mysql 表?

C:返回一个指向内存数据的函数