【发布时间】:2025-11-27 08:00:01
【问题描述】:
这是我的 C 代码
#include <stdio.h>
int main()
{
char c[3] = "abc";
char a[6] = "Shamal";
printf("%s\n\n", c);
printf("%s\n\n", a);
return 0;
}
这里的输出是
abcW?
Shamal
6 个字符的字符串正确显示字符串,而 3 个字符的字符串显示 W?在代码的末尾。
我知道我们需要输入空字符 '\0' 来终止字符串。但是这里两个字符串都没有空字符,但只有一个可以正常工作。这是什么原因?
【问题讨论】:
-
原因是未定义的行为是未定义的。或者换一种说法,没有理由,就是这样。
-
编译所有警告和调试信息 (
gcc -Wall -Wextra -g) -
c和a不是 字符串(没有 nul-terminating 字符),它们是 字符数组。如果您声明为,例如char c[] = "abc";(或char c[4] = "abc";),那么编译器将根据您的字符串初始化在末尾包含一个nul-terminating字符。您没有提供足够的空间(短 1 个字符)来创建字符串。 (P.S. nul-terninating 字符只是十进制0或字符'\0'-- 它们是等价的) -
只是为了添加一些不请自来的迂腐,根据标准应该是
int main(void)。