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)
这是行不通的。至少不可靠。这是未定义的行为,因为您正在访问阵列外部的内存。如果您不在阵列之外很远,它通常可以工作,但是这样做是非常危险的,并且在任何情况下,您处理它的方式都是不可接受的。
如果您需要更改大小,请使用如下所示的动态分配:
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标准的要求这一事实,就说明使用它们不是一个好主意。并且由于不再需要对它们的支持,因此将来使用它们可能会破坏您的代码。