C中的数组突变

3 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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

klu*_*utt 5

这是行不通的。至少不可靠。这是未定义的行为,因为您正在访问阵列外部的内存。如果您不在阵列之外很远,它通常可以工作,但是这样做是非常危险的,并且在任何情况下,您处理它的方式都是不可接受的。

如果您需要更改大小,请使用如下所示的动态分配:

int *a = malloc(n*sizeof(*a));
if (!a) { /* Handle error */ }
Run Code Online (Sandbox Code Playgroud)

然后:

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;
Run Code Online (Sandbox Code Playgroud)

实际上,我更喜欢动态分配,而不是每天都使用VLA:s。他们取消了对编译器支持现代C标准的要求这一事实,就说明使用它们不是一个好主意。并且由于不再需要对它们的支持,因此将来使用它们可能会破坏您的代码。