下面显示的代码 1 和代码 2 有什么区别。在这两种情况下,我都得到了相同的结果。内部有什么区别吗?
代码 1
char test[30]="KEL";
strcat (test,"DATA");
代码 2
char test[]="KEL"
strcat (test,"DATA");
最佳答案
在您的第一个代码示例中,test
将有 30 个字符的空间。
前 4 个将是字符串 "KEL"
+ nul 终止符(如果我没记错的话,其余的也将初始化为零,谢谢 chux )。将 "DATA"
连接到它是明确定义的。
在第二个示例中,它将只有 4 个空间,因为缓冲区的长度是从字符串文字中推导出来的。当您将 "DATA"
连接到它时,您将超出缓冲区的边缘进行写入。这是未定义的行为。
如果行为像此处一样未被标准明确定义,则您的编译器和运行时的实现可以做任何事情。你的程序可能会崩溃。或者可以让它运行险恶的代码。它也可以看起来像您的情况一样工作。但这不是您可以依赖的东西。
关于c - C 中的字符串声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41690263/