C中的数组突变

时间:2019-07-08 06:17:43

标签: c arrays variable-length-array

如果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]);
    }
}

3 个答案:

答案 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-它会被释放吗?

从一个较小的角度来看,它会为您工作,从更广泛的角度考虑,您必须谨慎使用每一位,这不是一个好习惯(请从这个角度考虑)。相反,这建议您使用动态内存分配会提高代码质量。