据我了解,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 ),一切皆有可能。
您期望发生什么?你的程序崩溃了?
如果您更频繁地调用 malloc
和 free
,这种情况仍可能发生。 malloc
通常会比请求多占用一些字节,并将额外的空间用于管理(所有内存块的链表、内存块的大小)。如果您在分配的 block 之前或之后写入一些字节,那么您很可能会弄乱内部管理结构,并且 free
的后续 malloc
将崩溃。
如果 malloc 在内部总是分配最少 n 个字节,那么您的程序可能只会在您访问字节 n+1 时崩溃。此外,操作系统通常只基于页面来保护内存。如果一个页面的大小为 512 字节,并且您的 malloc-ed 字节位于页面的中间,那么您的进程可能能够读写该页面的其余部分,并且只会在访问下一个内存页面时崩溃。但请记住:即使这有效,它也是未定义的行为。
关于c - 为什么 malloc(1) 用于存储 4 字节整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41822904/