2014-03-01 34 views
0

今天早上我刚刚与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); 

直到现在我还分配0字节为“TXT”,但我只能惊讶它为什么不给段错误,而不是给段错误,它是给予正确答案“地狱”。

任何人都可以解释我这样的C类行为吗?

+0

尝试调用'免费(txt)',看看会发生什么...... – pat

+0

当m调用free(txt)时,每件事情都很好,我的意思是没有错误即将到来,它给出了正确的答案。 @拍 – sdream

回答

0

我猜想,操作系统已实际分配比请求的字节数量更多,你写到,或操作系统返回一些指针不会导致段错误。

根据http://en.cppreference.com/w/cpp/memory/c/calloc

如果大小是零,则该行为

定义实现(空指针可以被返回,或者某些非空指针可以被返回可能不被用于访问存储)

显然你应该不是依靠这个。

1

A段错误是从来没有保证由C标准。一般来说,只有“未定义的行为”:如果您执行X,则允许发生任何事情。有时候,在某些操作系统上,您会遇到段错误。但也许你会“幸运”,没有什么不好的事情发生。或者你腐蚀一些你稍后会用到的内存,导致你的程序崩溃没有明显的原因。

在这种情况下,未定义的行为是由您写入您尚未分配的内存引起的。也许它工作,也许它不。