通过scanf定义列表的大小

时间:2014-03-09 20:57:03

标签: c list

我想编写一个程序,提示用户输入一个整数,我希望我的列表大小正好是整数。这是我的尝试:

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;
}

我收到一个错误,指出大小争论必须是一个常数值,有没有办法解决这个问题,还是我被迫定义最大尺寸?

2 个答案:

答案 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%zuVLA'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;
}