在网上阅读后,我发现C语言中有以下未定义的行为:
访问数组外部的元素

char a2[4] = {'g','e','e','k','s'};
printf("a2[4]:%d,%c\n",a2[4],a2[4]); //last index of a2 is 3
                                     //so a2[4] is undefined

数组初始化列表中有多余元素
int arr[3] = {1, 2, 3, 4, 5}; //size of arr is 3, but we specified 5 elements
                              //undefined behavior

我想问一下,在以下相关场景中,指针和字符串的行为是否未定义:
为字符数组指定更长的字符串:
char arr[5] = "geeks"; //"geeks" contains 6 characters including `\0`
                       //but arr has size 5

使用指针访问更远的索引。
char * arrptr = arr; //variable arr from point 1


char * arrptr = "geeks";

然后做
printf("%c",arrptr[7]);

我相信这肯定是未定义的,因为索引7不属于当前上下文中的任何内容。
有谁能澄清这一点,或者让我看看C标准中的相关章节吗?

最佳答案

char arr1[5] = "geeks"; // extra '\0': ok
char arr2[4] = "geeks"; // extra 's' and '\0': error

使用'\0'作为一个额外元素初始化char数组是一种特殊情况。见C11 6.7.9p14(重点是我的)
字符类型的数组可以由字符串文字或UTF-8字符串文字初始化,可以选择用大括号括起来。字符串文本的连续字节(如果有空间或数组大小未知,则包括终止的空字符)初始化数组的元素。

10-06 05:05
查看更多