今天早上我对C的行为感到惊讶。(这真让我感到惊讶。)
如果我写这样的代码:
char *txt;
strncpy(txt,"hello",4);
printf("%s\n",txt);
然后我知道它会给出分段错误,因为我没有为'txt'指针分配内存。好的....现在看到这段代码:
char *txt = (char *) calloc(0,sizeof(char ));
strncpy(txt,"hello",4);
printf("%s\n",txt);
仍然我已经为'txt'分配了0个字节,但我很惊讶为什么它没有给出分段错误?而不是给出分段错误,它给出正确答案“地狱”。
任何人都可以解释一下C的这种行为吗?
答案 0 :(得分:1)
C标准保证永远不会。通常只有“未定义的行为”:如果你做X,任何事都可以发生。有时,在某些操作系统上,您会遇到段错误。但也许你会“幸运”而且没有什么不好的事情发生。或者你破坏了稍后会使用的一些内存,导致你的程序崩溃,没有明显的原因。
在这种情况下,未定义的行为是由您写入尚未分配的内存引起的。也许它有效,也许它没有。
答案 1 :(得分:0)
我猜测操作系统实际上已经分配了超过请求的字节数并且您正在写入,或者操作系统返回了某些指针,这不会导致段错误
根据http://en.cppreference.com/w/cpp/memory/c/calloc
如果size为零,则行为是实现定义的(可能返回空指针,或者可能返回一些可能不用于访问存储的非空指针)
显然你应该不依赖于此。