C 为什么当数组的索引为3时输出为“three-four”,当索引为7时输出为“seveneightine”?

C 为什么当数组的索引为3时输出为“three-four”,当索引为7时输出为“seveneightine”?,c,C,数组“one”的大小为10,每个数组最多可包含5个字符。一[3]的输出为“三四”,最大字符数为5个,一[3]中“三”的大小为5个。为什么它打印“三四”表示一[3]? 代码是: #include<stdio.h> #include<string.h> int main(){ char input[8]; printf("Enter the integer: "); scanf("%c",input); char ones[10][5]={"z

数组“one”的大小为10,每个数组最多可包含5个字符。一[3]的输出为“三四”,最大字符数为5个,一[3]中“三”的大小为5个。为什么它打印“三四”表示一[3]? 代码是:

#include<stdio.h>
#include<string.h>
int main(){
    char input[8];
    printf("Enter the integer: ");
    scanf("%c",input);
    char ones[10][5]={"zero","one","two","three","four","five","six","seven","eight","nine"};
    printf("%d\n",input[0]-'0');
    puts(ones[3]);
    return 0;
}
输出: 输入整数:3 3.
Three-Four

您通过将访问权限置于范围之外而调用了未定义的行为。一的每个元素只有5个元素,因此当您尝试在其中存储三个元素时,将没有空间存储终止的空字符。再分配一个元素,即使用[10][6]来避免这种情况。

不要将代码作为图像发布。请在问题中直接以文本形式发布代码。欢迎使用stackoverflow,请阅读并提供代码样本。感谢Ohad Eytan,我一定会阅读。在数组中,当我们提到大小为5时,0-4表示数据,第5表示“\0”,对吗?如果我错了,请纠正我。你确定这是未定义的行为吗?据我所知,2维数组的内存形状定义得很好,因此最后一个空字符会侵入到1[4][0],然后被的f覆盖four@Ankesh在大小为5的数组中没有数组[5],因为这将是第6个元素。最后一个元素是数组[4]。@OhadEytan是。引用J.2 Undefined behavior:数组下标超出范围,即使对象显然可以使用给定下标访问,如左值表达式a[1][7]中给定的声明int a[4][5]6.5.6。