我的问题是为什么以下代码段不会崩溃?
int main(int argc, const char * argv[])
{
const char* source = "SomeText";
char* dest = (char*)malloc(sizeof(char)); // isn't this wrong ?
strcpy(dest, source);
printf("%s\n", dest);
free(dest);
return 0;
}
答案 0 :(得分:2)
strcpy
将超出缓冲区。这将导致未定义的行为甚至程序崩溃(segfault),因为strcpy
将尝试写入未分配给缓冲区的内存。你不能依赖发生的事情。下次运行程序时,它可能会崩溃。以下是我建议的一些修复方法。
// in main
const char *source = "SomeText";
char *dest = malloc(strlen(source) + 1); // +1 for the null byte at the end
if(dest != NULL) { // check for NULL
strcpy(dest, source);
printf("%s\n", dest);
free(dest);
}
else {
printf("not enough memory\n");
}
strlen
不计算字符串中的空字节,因此您必须为strcpy
字符串中的source
分配一个额外字节。您应该检查malloc
的结果为null。此外,您不应该投射malloc
的结果。没有任何好处,如果您忘记包含stdlib.h
头文件,它可能会导致错误。
答案 1 :(得分:1)
因为它是未定义的行为并且可能会发生工作。写入未分配的空间是一项风险操作,无法保证成功。
答案 2 :(得分:1)
在这种情况下的行为是未定义的。实际上,保留位置之外的内存将被覆盖。这个记忆可以包含一些重要信息。它可以映射到进程的地址空间中。如果未映射,则会发生系统错误。如果它被映射,那么最可能这个内存包含正确工作malloc和free所需的值,所以你可能会期望在下一个malloc或free上崩溃。如果覆盖大部分内存,可以写入其他动态分配的缓冲区。
在您的情况下,您只覆盖保留位置外的8个字节。最可能的是,这8个字节被映射到地址空间并且根本不使用。这就是为什么没有发生。确切的行为取决于malloc和free的特定实现..
答案 3 :(得分:1)
运气?
但通常malloc会抓取便于操作系统的内存。所以也许它是1K