如果C语言中的数组大小固定,那么此代码如何正常工作? 该代码有效,但是我的老师说我做错了方法...
int main()
{
int n,element,i;
printf("Enter the size of Array : ");
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++){
printf("Enter %d no element : ",i+1);
scanf("%d",&a[i]);
}
printf("Enter the new element to be inserted at the End: ");
scanf("%d",&element);
n=n+1;
a[n-1]=element;
for(i=0;i<n;i++){
printf("%d\t",a[i]);
}
}
答案 0 :(得分:5)
它不起作用。至少不可靠。这是未定义的行为,因为您正在访问数组外部的内存。如果您不在阵列之外很远,它通常可以工作,但是这样做是非常危险的,并且在任何情况下,您处理它的方式都是不可接受的。
如果需要更改大小,请使用如下所示的动态分配:
int *a = malloc(n*sizeof(*a));
if (!a) { /* Handle error */ }
然后:
n=n+1;
// Using a void pointer, because this pointer should not be used for
// dereferencing
void *tmp = realloc(a, n*sizeof(*a));
if (!tmp) { /* Handle error */ }
a = tmp;
实际上,我希望动态分配而不是每天都使用VLA:s。他们取消了对编译器支持现代C标准的要求这一事实,就说明使用它们不是一个好主意。而且由于不再需要对它们的支持,因此将来使用它们可能会破坏您的代码。
答案 1 :(得分:0)
您在高铁上买了票,很幸运的是还有一个空的 站点旁边,然后将书包放到它上面。这并不意味着您拥有该站点,只是因为现在没有其他人拥有该站点。
事实上,要编程,您不会声明自己拥有此内存,可以对其进行修复,然后一切正常,直到某个程序声明拥有该内存为止。就像另一个自己的高铁售票员站在您旁边并向他展示票。
int a[n];//mean you own n size of int so you own a[0]~a[n-1] this n mean in this line your n value,if next line n increase a's size will not increase
//------------------------------------------------------------
//Not legal because n is not const
int a[n];
//------------------------------------------------------------
//In fact this is legal
int *a;
a=(int*)malloc(sizeof(int)*n);//will alloc n of int for you
//Do something you want
//
free(a);//release your memory alloc
//------------------------------------------------------------
//Or just give a big enough for a like
int a[1000];
//------------------------------------------------------------
答案 2 :(得分:-1)
如果我想将分配的内存位置释放给您注入的最后一个变量,该怎么办。
1-它会被释放吗?
从一个较小的角度来看,它会为您工作,从更广泛的角度考虑,您必须谨慎使用每一位,这不是一个好习惯(请从这个角度考虑)。相反,这建议您使用动态内存分配会提高代码质量。