下面是两个方法,它们都用于创建数组,其大小由用户输入决定。
我总是觉得,其"大小"在编译后由用户确定的数据结构必须使用 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("%dn", 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("%dn",arr[i] );
}
return 0;
}
我的问题是,为什么示例 2 不需要 malloc((,即使程序在编译时不知道数组大小?
示例 2 使用在 C99 中引入的可变长度数组 (VLA(。
不受约束地接受 VLA 的用户输入是危险的; 如果堆不足,malloc()
将失败并返回 NULL。 另一方面,VLA 没有定义的方法来处理或指示故障,并且通常从更有限的堆栈空间中分配。
另一方面,VLA 是真正的数组,sizeof(arr)
计算数组的大小,而不是指针的大小(并且具体不是编译时常量(。