我写了以下代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char* ch = malloc(0 * sizeof(char));
int n = 300;
sprintf(ch, "%d", n);
printf("ch is : %s", ch);
return 0;
}
我已经将malloc函数中的0切换为不同的数字进行实验,我尝试将0表示分配无内存但是当我运行程序时它工作得很好而且我不明白为什么这就是因为如果我把它当作没有记忆就这样发生了什么?
答案 0 :(得分:2)
C让你自己射中脚。
malloc文档说
如果size为零,则返回值取决于特定库 实现(它可能是也可能不是空指针),但返回 指针不得解除引用。
所以你的实现返回的不是零。你的sprintf正在写入“不应该”写入的内存。但在这种特殊情况下,你很幸运,而且它无处不在 - 至少在这个简短的测试程序中无处可寻。在一个有更多mallocs和frees的更长的程序中,你几乎肯定会遇到麻烦。
答案 1 :(得分:1)
malloc(0)
是实现定义的。它可能返回一个空指针,详见C FAQ。
问题出在以下几行:
printf("ch is : %s", ch);
ch
不是字符串(即以空字符结尾的字符数组),用"%s"
打印它是非法的。