在网上阅读后,我发现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字符串文字初始化,可以选择用大括号括起来。字符串文本的连续字节(如果有空间或数组大小未知,则包括终止的空字符)初始化数组的元素。