我写了以下代码:
#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设置为0就像是不分配内存那么这里发生了什么?
C让你搬起石头砸自己的脚。
malloc文档说
如果size为0,则返回值取决于特定的标准库实现(它可能是也可能不是空指针),但是返回不能对指针解引用。
所以你的实现返回的不是零。你的sprint正在写入它"不应该"写入的内存。但在这个特殊的情况下,你很幸运,它不是关键的,至少在这个简短的测试项目中,它不是重要的。在具有更多malloc和free的较长程序中,您几乎肯定会遇到麻烦。
malloc(0)
是实现定义的。它可能返回一个空指针,详见C FAQ。
问题出在下一行:
printf("ch is : %s", ch);
ch
不是字符串(即,以空结尾的字符数组),用"%s"
打印它是非法的。