'\ 0'末尾的C字符串

时间:2018-09-18 11:14:27

标签: c string strcpy

在编写C代码时,我尝试编写自己的SO_BINDTODEVICE代码,但遇到了这个问题。

strcpy
  

错误代码:进程结束,退出代码为-1073741819(0xC0000005)

感谢s.o上的this question,我了解到字符串应该以'\ 0'结尾,但是为什么上面的代码即使声明时也不会导致错误,却还是无法正常工作? (当char b [10] =“ 123456789”时效果很好)

那么,'\ 0'到底如何影响此过程并最终导致错误? (运行时?编译时?等等) (我只知道'\ 0'应该是字符串的结尾)

2 个答案:

答案 0 :(得分:6)

char b[10] = "1234567890";行上,字符串文字"1234567890"正好是10个字符+ 1个空终止符。数组中没有剩余空间,因此不会以null终止。

通常,编译器会警告您提供太大的初始化器,但是这种特殊情况是一个非常特殊的陷阱。在C标准的初始化规则中,我们发现了这个小邪恶的规则(C17 6.7.9§14,重点是我的):

  

字符类型的数组可以由字符串文字或UTF-8字符串初始化   文字,可以选择用大括号括起来。字符串文字的连续字节(包括   终止空字符如果有空间或数组大小未知),初始化   数组的元素。

您的情况下没有空间,因此您不会出现空字符。而且由于这个奇怪的小规则,编译器也没有警告它,因为代码符合C标准。

答案 1 :(得分:4)

char b[10] = "1234567890";不包含NUL终止符,因此

while ((*s++ = *t++));

不能正确终止(正式的程序行为是 undefined )。请注意,常量"1234567890"char[11]类型。编译器允许您将其分配给较小的数组,并自动删除元素。