在编写C代码时,我尝试编写自己的SO_BINDTODEVICE
代码,但遇到了这个问题。
strcpy
错误代码:进程结束,退出代码为-1073741819(0xC0000005)
感谢s.o上的this question,我了解到字符串应该以'\ 0'结尾,但是为什么上面的代码即使声明时也不会导致错误,却还是无法正常工作? (当char b [10] =“ 123456789”时效果很好)
那么,'\ 0'到底如何影响此过程并最终导致错误? (运行时?编译时?等等) (我只知道'\ 0'应该是字符串的结尾)
答案 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]
类型。编译器允许您将其分配给较小的数组,并自动删除元素。