当我跑步时:
char string[6];
string[0] = 'h';
printf("%s", string);
正如预期的那样,它输出:h
如果我跑步:
int x = 1;
char string[5 + x];
string[0] = 'h';
printf("%s", string);
它输出 h 后跟 � 和其他随机字符。我猜它正在访问内存地址,这是不应该的。每次运行的角色都不一样。
当我执行相同操作但将第二行替换为“char string[5 + x] = {}”时 它错误:可变大小的对象可能未初始化。
如果我对整数数组做同样的事情,如果我输入“int array[5 + x] = {};”,它就可以完美工作。但不是“int array[5 + x]”
int 数组的大小声明中允许使用变量,但 char 数组/字符串中不允许使用变量吗?
如评论中所述,您的问题是以下内容调用未定义的行为。
int x = 1; char string[5 + x]; string[0] = 'h'; printf("%s", string);
未定义的行为源于使用
string
作为字符串。 C 中的字符串需要一个空终止字符来表示字符串的结束。您的可变长度数组尚未初始化(除了第一个字符),因此内容不确定。
在第一种情况下,
string[1]
显然是0
,因此以空值终止字符串。这是不能保证的,正如您从第二个示例中看到的那样,其中 printf
打印出乱码,因为它在 'h'
作为空终止符之后没有看到下一个字符。