从命令行参数分配数组

时间:2010-07-27 16:35:00

标签: c arrays

我正在处理一个小型C应用程序,我正在从命令行捕获一个值。我想捕获值并使用它来初始化数组。这就是我想要做的。

int main(int argc, char* argv[]) {
    int option = atoi(argv[2]);
    int values[option];
    ......
 }

我正在编译,因为我的选项变量不是const。 错误:错误2错误C2057:预期的常量表达式

我有办法做到这一点吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:8)

如果在编译时未知大小,则需要使用malloc动态分配内存:

 int main(int argc, char* argv[]) {
    int option = atoi(argv[2]);
    int* values = malloc(option * sizeof(int));
    /* ...... */
    free(values); /* Deallocate the memory when you are done with it */
 }

答案 1 :(得分:1)

如果你的编译器支持C99,那么(如果你不介意生活有点危险,假设没有检查argv [2]被定义或者它的值可以转换成一个正整数),你可以写:

#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
    int option = atoi(argv[2]);
    char *values[option];
    int i;
    int n = argc - 3;
    for (i = 0; i < n; i++)
        values[i] = argv[i+3];

    for (i = 0; i < n; i++)
        printf("values[%d] = %s\n", i, values[i]);
    return 0;
}

使用C99 VLA(可变长度数组)功能编译并运行。注意我将'values'的类型更改为'char *',主要是为了懒惰 - 来完成某些事情。

警告消息看起来像来自MSVC,而MSVC 2010仍然不支持添加到C99的许多额外功能。因此,对于那种环境,您将不得不重新考虑内存分配:

#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
    int option = atoi(argv[2]);
    char **values = malloc(option * sizeof(*values));
    int i;
    int n = argc - 3;
    for (i = 0; i < n; i++)
        values[i] = argv[i+3];

    for (i = 0; i < n; i++)
        printf("values[%d] = %s\n", i, values[i]);

    free(values);
    return 0;
}

微妙的注意事项:'sizeof'的操作数为'*values',即使您从'{{更改'values'的类型,它仍会保持正确的大小1}}'回到你的大纲中的'char **'。如果我写了“int *”,那么您必须更改两件事 - “sizeof(char *)”的声明和“values”中的类型名称。