为什么下面的程序program1
,打算打印数字1-9
挂起并突然关闭,即使它编译没有错误?我怀疑这与我使用变量作为整数数组arr[]
的索引这一事实有关。我希望用户被提示输入数组的大小,并在此基础上填满该数组。虽然我可以直观地指出问题的原因是变量索引,但我想知道以下原因:
如果程序出错,为什么编译时没有错误或警告?
代码出错的技术原因是什么?我们不能使用变量作为数组索引吗?是否有一种方法或malloc()
是仅解决方案?
//Program1
#include<stdio.h>
int main()
{
int n,arr[n],i;
printf("Enter the size of n");
scanf("%d",&n);
for(i=0;i<n;i++)
arr[i]=i;
for(i=0;i<n;i++)
printf("%dn",arr[i]);
}
我已经在program2
中使用malloc()
实现了相同的功能,并且该程序可以很好地使用它。但是我想知道上面的程序program1
失败的原因,而不是盲目地使用malloc()
,因为它太方便了。
//Program2
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n,*ptr,i;
printf("Enter the size of arrayn");
scanf("%d",&n);
ptr=malloc(sizeof(int)*n);
for(i=0;i<n;i++)
ptr[i]=i;
for(i=0;i<n;i++)
printf("%dn",ptr[i]);
free(ptr);
}
int arr[n]
表示,"使用n
指定此数组的元素数量"。但是,此时,变量n
的值是未定义的。我完全不知道为什么你的编译器让你侥幸逃脱,但未定义的行为是为什么你的程序不能正常工作。在这种情况下,使用malloc是正确的方法。
在大小已知之前构建arr
。仅仅因为你事先声明了n
并不意味着n有一个值
int arr[n]
是一个变量定义。这些是在编译时根据n的值计算的。n的值是不确定的,所以数组的大小是随机的——坦率地说,我对它编译感到惊讶,如果它编译没有警告,我就更惊讶了。
声明后arr [n] scanf…