我想编写一个程序,提示用户输入一个整数,我希望我的列表大小正好是整数。这是我的尝试:
int main(void){
int target;
printf("Enter # of elements in list: ");
printf("\n");
scanf("%d", &target);
// Initialize List
int list[target];
// Code to populate list from 1 to target here
return 0;
}
我收到一个错误,指出大小争论必须是一个常数值,有没有办法解决这个问题,还是我被迫定义最大尺寸?
答案 0 :(得分:2)
您可以在C99(或更高版本)中执行此操作,但默认情况下您的编译器可能设置为C89 / C90 / ANSI-C。尝试在命令行上传递-std=c99
。
如果您的编译器不支持C99模式,您需要通过malloc
使用动态分配:
int * list = malloc(target * sizeof *list);
您应该检查list
是否NULL
malloc
,以防free(list)
失败,并且在您&#39时忘记拨打list
完成它!
请注意,您已将int
定义为scanf("%d")
,并且您正在使用size_t
阅读它,因此它可能是负值。这可能导致一些undesirable behaviour。因此,请考虑将声明更改为malloc
(%zu
和VLA's期望的类型)。然后使用%u
(或%zu
如果%d
不可用)而不是scanf
阅读。
最后,您应检查target
的返回值,以确保您的值已正确读取,如果它的值小于您想要读取的值的数量(在您的情况下为1)将意味着未读取值并且target
的内容保持不变。在您的情况下,{{1}}将具有未定义的内容,因此如果用户没有输入有效数字,您的程序将调用未定义的行为。
答案 1 :(得分:1)
这称为可变长度数组,其大小在运行时确定,而不是在自动数组的情况下在编译时确定。 C99和C11支持可变长度数组,但它是一个条件特性,并且不需要实现来支持它。 gcc
支持它,您应该使用标记-std=c99
进行编译。另一个选择是动态分配你的数组。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int target;
printf("Enter # of elements in list: ");
scanf("%d", &target);
int *list = malloc(d * sizeof *list);
if(list == NULL) {
printf("Not enough memory to allocate.\n");
return 1;
}
// do stuff with list
// after you are done with list
free(list);
list = NULL;
return 0;
}