c语言 - 为什么"int arr[n];"导致我的程序挂起,而索引"n"稍后由scanf()输入?



为什么下面的程序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…

最新更新