c - 字符串终止符问题
问题描述
如果我输入这段代码,它会编译并运行(我使用 GCC)
#include<stdio.h>
int main()
{
char sentence[8]="September";
printf("The size of the array is %d \n",sizeof(sentence));
printf("The array is %s \n",sentence);
}
并给出输出
数组大小为 8
该阵列是Septembe
这是如何工作的?C 需要一个字符串终止符才能知道字符串已经结束。数组如何值 8 个字节的空间并知道在哪里停止?
解决方案
通过将非 NUL 终止的字符串传递给printf("%s")
,您正在调用未定义的行为。
就其本质而言,结果是不确定的。它可能看起来“有效”(就像你看到的那样)。
正如其他人所解释的那样,可能发生的事情是您的字符串后面恰好有一个零字节,这停止printf
了进一步发展。但是,如果您要围绕该变量添加更多内容,您可能会看到不同的行为:
#include<stdio.h>
int main(void)
{
char sentence[8] = "September"; // NOT NUL TERMINATED!
char stuff[] = "This way is better";
printf("%s\n", sentence); // Will overrun sentence
return 0;
}
推荐阅读
- javascript - 有什么方法可以解决 javascript/jquery 中 veracode 的 appendchild xss 缺陷
- python - 列表中的项目成为最后添加项目的副本
- javascript - 如何为每个结果javascript获取新行
- flutter - 将 TextField InputDecoration LabelText 位置和 CounterText 位置更改为后缀
- php - php 项目在本地主机服务器上工作,但在实时服务器上不工作
- python - 如何遍历两个数据帧以在第二个数据帧上找到最接近的值而不循环
- css - 再次滚动时如何防止关键帧动画重新启动?
- azure - ADF Copy Activity FTP Source 奇怪的行为
- python - 安装 dask-ml 引发“解决环境”错误
- mysql - MySQL 我无法向表中添加外键