c - 使用较大数组初始化字符数组时的行为

标签 c arrays

我正在用 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/

相关文章:

java - 如何开发使用 Android 源代码中的 C 文件的应用程序

c - 要在 Windows 或 Visual Studio 中获取大块内存,您需要做些什么特别的事情吗?

javascript - 定位所有 <label> 标签并存储在关联数组中

c# - C#使用唯一的整数填充数组No Linq或ArrayLists;

c - 在 C 中使用 malloc 时是否需要类型转换?

改变函数中某些东西的值

c++ - 将 "pointer to data"转换为 "pointer to function"

python - 使用 ctypes : passing vectors 从 python 调用 c

c# - 获取数组的平均值

arrays - 如何将键值对象插入redis中的lua表