我正在用 C 尝试一些数组相关的东西。
我做了以下操作:
char a2[4] = {'g','e','e','k','s'};
printf("a2:%s,%u\n",a2,sizeof(a2));
printf("a2[4]:%d,%c\n",a2[4],a2[4]);
在此code ,它打印:
a2:geek,4
a2[4]:0,
在此code ,它打印:
a2:geek�,4
a2[4]:-1,�
两种代码都在同一个在线编译器上运行。那为什么输出不同。是不是因为标准将这种情况定义为未定义的行为。如果是,您能否指出标准的确切部分?
最佳答案
是的,这是未定义的行为。我没有引用标准,但 %s
格式用于打印以 null 结尾的字符串,并且 a2
上没有 null 终止符。当您访问 a2[4]
时,您正在访问数组边界之外,这是未定义行为的另一个原因。
最后,数组初始化器也会导致未定义的行为,参见 Is it ok to have excess elements in array initializer?
关于c - 使用较大数组初始化字符数组时的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53674063/