0

为什么以下程序会挂起并突然关闭,即使它编译没有错误?我怀疑这与我使用变量作为整数数组的索引这一事实有关program1。我希望用户提示输入数组的大小,并据此填充该数组。虽然我可以直观地确定问题的原因这里是变量索引,但我想知道以下原因:1-9arr[]

如果程序出错,为什么程序编译时没有错误或警告?

代码错误的技术原因是什么?我们不能使用变量作为数组索引吗?有没有办法或者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("%d\n",arr[i]);
}

我已经实现了相同的使用malloc()inprogram2并且程序运行良好。但是我想知道上述程序program1失败的原因,而不是malloc()仅仅因为它太方便而盲目使用。

//Program2

#include<stdio.h>
#include<stdlib.h>

int main()
{

int n,*ptr,i;
printf("Enter the size of array\n");
scanf("%d",&n);
ptr=malloc(sizeof(int)*n);
for(i=0;i<n;i++)
ptr[i]=i;

for(i=0;i<n;i++)
printf("%d\n",ptr[i]);

free(ptr);

}
4

4 回答 4

3

int arr[n]说,“n用于指定此数组的元素数”。但是,此时,变量的值n是未定义的。我完全不知道为什么你的编译器会让你侥幸逃脱,但未定义的行为是你的程序无法正常工作的原因。在这种情况下,使用 malloc 是正确的方法。

于 2013-05-03T16:21:29.457 回答
0

您在知道大小之前正在构建arr。仅仅因为您n事先声明并不意味着 n 具有价值。

于 2013-05-03T16:21:32.377 回答
0

int arr[n]是一个变量定义。这些是在编译时根据 n 的值进行评估的。n 的值是不确定的,所以数组的大小是随机的——坦率地说,我对它编译感到惊讶,如果编译时没有警告,我会更加惊讶。

于 2013-05-03T16:23:02.997 回答
0

在 scanf ... 之后声明 arr[n]

于 2014-10-21T11:12:48.277 回答