c - 通过 scanf 定义列表的大小

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

我收到一条错误消息,指出大小争论必须是一个常数值,有没有办法解决这个问题,或者我是否被迫定义最大大小?

最佳答案

您可以在 C99(或更高版本)中执行此操作,但您的编译器可能默认设置为 C89/C90/ANSI-C。尝试在命令行中传递 -std=c99

如果您的编译器不支持 C99 模式,您将需要通过 malloc 使用动态分配:

int * list = malloc(target * sizeof *list);

你应该检查 list 是否不是 NULL,以防 malloc 失败并且不要忘记调用 free (list) 完成后!

请注意,您已将 list 定义为 int,并且您正在使用 scanf("%d") 读取它所以它可以是一个负值。这可能会导致一些 undesirable behaviour .因此考虑将声明更改为 size_t(mallocVLA's 期望的类型)。然后使用 %zu(如果 %zu 不可用,则使用 %u)而不是 %d 读取它.

最后,您应该检查 scanf 的返回值以确保您的值被正确读取,如果它少于您想要读取的值的数量(在您的情况下为 1),它将意味着该值未被读取并且您的 target 的内容保持不变。在您的情况下,target 将具有未定义的内容,因此如果用户未输入有效数字,您的程序将调用未定义的行为。

关于c - 通过 scanf 定义列表的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22288068/

相关文章:

c - 仅使用 Posix 功能,将文件增长到 X 字节大的最有效方法是什么?

python - 按多列排序时为每列设置升序降序

python-3.x - 如果我在带括号的列表中有重复项,我该怎么办

c - 在 C 中使用管道读取多条消息?

math - 当 r < 0 时,(n - (~r % n) - 1) 和 (n - (abs(r) % n)) 之间有区别吗?

将数组的元素复制到 C 中的链表

python - 简单的 python 嵌套循环 - 索引超出范围

python - 在 Python 列表中迭代 - 它是复制还是使用迭代器?

c++ - 如何从 std::list 中正确删除指针?

c - C 中的寄存器数组