不为null终止C样式字符串

h4c*_*k3d 1 c string c-strings

给一个字符串,比方说,

char *str = "Hello,StackOverflow!"
char newStr[30];
int l = strlen(str);
for(int i =0 ; i<l ; i ++ )
   newStr[i] = str[i];
printf("%s" , newStr);
Run Code Online (Sandbox Code Playgroud)

现在,我们知道c字符串的最后一个字符必须是'\0',因为在这里我们没有明确地做同样的事情(在字符串newStr的最后一个索引处存储'\ 0'),这个程序应该崩溃,因为printf不会找到字符串的结尾.

但是我注意到它有时很好用,有时它不是.可能是什么问题呢 ?它几乎每次都在工作.是不应该崩溃或给出一些运行时错误?

在C++中它也是同样的情况吗?

小智 6

不.它调用未定义的行为 - 这意味着它不必崩溃 - 它可以做任何事情,如鼻子恶魔.

此外,"给出运行时错误" - 嗯,这取决于运行时错误的含义.C没有动态运行时 - 如果您期望异常的格式错误消息,则不会发生.会发生什么最有可能是分段错误.

总而言之,如果一个导致/使用未定义的行为,他不能依赖它崩溃或不崩溃.