【发布时间】:2012-04-29 03:57:47
【问题描述】:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char *p;
p = (char *)malloc(4*sizeof(char));
strcpy(p, "abcdabcd");
printf("%s\n", p);
free(p);
printf("%s\n", p);
return 0;
}
我尝试在 Ubuntu 上运行上述代码。这里我从 malloc 分配 4 个字节的内存。然后我尝试将 8 个字节复制到 malloc 分配的内存中。我没有收到任何警告或错误。我尝试释放内存块并尝试使用被释放的相同内存,但再次没有问题。它打印了正确的字符串。有人可以解释一下这种行为吗?
【问题讨论】:
-
基本上它的 C 和它由你来执行这些事情。因为 C 非常强调性能,所以不会浪费 CPU 时间来为您执行它。
-
大多数时候 malloc 分配的内存比你指定的多。我想这就是你的程序有效的原因。
-
物理内存通常存在于 4kb 页面中,因此可能 malloc 实现会考虑这一点并在您的情况下分配 1 个页面。
-
@strkol,请提供您的断言的来源。
-
@YoussefG.,编译程序并对其进行 strace,您会发现以下内容:mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76e0000。 malloc() 分配了 4096 个字节...
标签: c