以下两种方法都适用于创建数组,其大小由用户输入决定。
我总是认为数据结构的大小'由编译后的用户确定必须使用malloc()创建。 示例一说明了这一点。
但是,示例二显示了一个更简单的方法,不需要malloc()。
示例#1:创建和数组,其大小由用户输入决定。使用Malloc()。
int main() {
int N;
printf( "Number:" );
scanf( "%d", &N );
int *ptr = createArray(N);
for (int i = 0; i < N; i++) {
printf("%d\n", ptr[i]);
}
free(ptr);
return 0;
}
int *createArray(int N) {
int *ptr = malloc(N);
for (int i = 0; i < N; i++) {
ptr[i]=N;
}
return ptr;
}
示例#2:创建和数组,其大小由用户输入决定。不使用Malloc()。
int main() {
int N;
printf( "Number:" );
scanf( "%d", &N );
int arr[N];
for (int i = 0; i < N; i++) {
arr[i] = N;
}
for (int i = 0; i < N; i++) {
printf("%d\n",arr[i] );
}
return 0;
}
我的问题是,为什么在示例2中不需要malloc(),即使程序在编译时不知道数组大小?
答案 0 :(得分:4)
示例2使用在C99引入的可变长度数组(VLA)。
接受没有约束的VLA的用户输入是危险的;如果堆不足,malloc()
将失败并返回NULL。另一方面,VLA没有定义处理或指示失败的方法,通常从更有限的堆栈空间分配。
另一方面,VLA是真正的数组,sizeof(arr)
计算数组的大小,而不是指针的大小(特别是不是编译时常量)。