c - C 中的字符串声明

标签 c arrays string initialization undefined-behavior

下面显示的代码 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/

相关文章:

c++ - switch-case 标签中的 C11 和常量表达式求值

c - Linux dma 设备驱动程序 dma_request_channel 失败

python - python 将文件读入数组

wpf - 在 WPF 绑定(bind)中将值设置为 null

python - 如何使用 Python 从字符串中删除一个字符

用 C 语言为 IRC 机器人创建一个基本 shell,并在后台运行另一个线程

c++ - 线程与 pthread 条件变量同步

c - printf 打印超过数组的大小

arrays - 如何将值从一个数组添加到另一个数组?

c++ - std::string == 运算符不工作