这是一个数组程序。
Practice.c
#include <stdio.h>
void main()
{
int i,num[10]={10,20,30,40,50};
for(i=0;i<15;i++)
{
printf("\nnum[%d] =%d",i,num[i]);
}
}
以下是本程序的输出。
num[0] =10
num[1] =20
num[2] =30
num[3] =40
num[4] =50
num[5] =0
num[6] =0
num[7] =0
num[8] =0
num[9] =0
num[10] =10
num[11] =0
num[12] =2686711
num[13] =2686820
num[14] =4199443
现在我有两个问题:
1-为什么num[5] to num[9]
将值显示为0
?
2-为什么num[10] to num[14]
显示这些值,当我只声明长度为int num [10]
而不是int num [15]
时,程序不应显示错误,而正在运行或编译?
答案 0 :(得分:4)
以下是您的计划正在做的事情:
int num[10] = {10,20,30,40,50}
上面一行告诉编译器创建一个包含十个整数的数组,并将前五个值(索引0-4)初始化为您提供的值。其余值(索引5-9)根据C99规范自动初始化为零。
num[9] # This value was specifically allocated and initialized.
num[10] # This value was neither allocated nor initialized but it exists anyway.
当你说num[9]
你告诉编译器访问距离数组开头名为num
的九个整数的整数时,事实上,它几乎完全相同正如*(num+(int*)9)
所述。
幸运的是,您可以访问第10到第15个值 - 您没有要求编译器分配该空间,但无论如何它都在那里,并且计算机没有阻止你看它。
总而言之,您刚刚发现C语言并不能阻止您访问尚未初始化或明确要求分配的值!