Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从命令行参数分配数组_C_Arrays - Fatal编程技术网

C 从命令行参数分配数组

C 从命令行参数分配数组,c,arrays,C,Arrays,我正在开发一个小型C应用程序,并从命令行捕获一个值。我希望捕获该值并使用它初始化数组。这就是我要做的 int main(int argc, char* argv[]) { int option = atoi(argv[2]); int values[option]; ...... } 我得到一个编译,因为我的选项变量不是常量。 错误:错误2错误C2057:应为常量表达式 我有办法做到这一点吗 谢谢你的帮助 如果编译时不知道大小,则需要使用malloc动态分配内存:

我正在开发一个小型C应用程序,并从命令行捕获一个值。我希望捕获该值并使用它初始化数组。这就是我要做的

int main(int argc, char* argv[]) {
    int option = atoi(argv[2]);
    int values[option];
    ......
 }
我得到一个编译,因为我的选项变量不是常量。 错误:错误2错误C2057:应为常量表达式

我有办法做到这一点吗


谢谢你的帮助

如果编译时不知道大小,则需要使用
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 */
 }

如果编译时不知道大小,则需要使用
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 */
 }

如果您的编译器支持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;
}
#包括
#包括
int main(int argc,char*argv[])
{
int option=atoi(argv[2]);
字符*值[选项];
int i;
int n=argc-3;
对于(i=0;i
这将使用C99 VLA(可变长度数组)功能编译和运行。注意,我将“值”的类型改为“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;
}
#包括
#包括
int main(int argc,char*argv[])
{
int option=atoi(argv[2]);
字符**值=malloc(选项*sizeof(*值));
int i;
int n=argc-3;
对于(i=0;i

需要注意的微妙点是:“
sizeof
”的操作数是“
*values
”,即使您将“
values
”的类型从“
char**
”更改回大纲中的“
int*
”,它的大小仍然正确。如果我写了“
sizeof(char*)
”,那么你必须改变两件事——“
值的声明”
”和“
sizeof()
”中的类型名。

如果你的编译器支持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;
}
#包括
#包括
int main(int argc,char*argv[])
{
int option=atoi(argv[2]);
字符*值[选项];
int i;
int n=argc-3;
对于(i=0;i
这将使用C99 VLA(可变长度数组)功能编译和运行。注意,我将“值”的类型改为“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;
}
#包括
#包括
int main(int argc,char*argv[])
{
int option=atoi(argv[2]);
字符**值=malloc(选项*sizeof(*值));
int i;
int n=argc-3;
对于(i=0;i

需要注意的微妙点是:“
sizeof
”的操作数是“
*values
”,即使您将“
values
”的类型从“
char**
”更改回大纲中的“
int*
”,它的大小仍然正确。如果我写了“
sizeof(char*)
”,那么您必须更改两件事,“
值的声明”
”和“
sizeof()
”中的类型名。

谢谢泰勒……在使用malloc分配内存时,为什么要乘以sizeof()?是值类型还是选项类型的参数大小?
malloc
以字节为单位分配。乘以
sizeof(int)
将所需
int
s的数量转换为所需的字节数。提问者代码对我来说编译为ok。有什么理由不使用C99中引入的VLA功能吗?@klw,因为如果OP的编译器抱怨它,它显然不支持C99。“C2057”错误代码表明是Microsoft编译器,它显然不是C99编译器。谢谢泰勒……在使用malloc分配内存时,为什么要乘以sizeof()?是值类型还是选项类型的参数大小?
malloc
以字节为单位分配。乘以
sizeof(int)
将所需
int
s的数量转换为所需的字节数。提问者代码对我来说编译为ok。有什么理由不使用C99中引入的VLA功能吗?@klw,因为如果OP的编译器抱怨它,它显然不支持C99。“C2057”错误代码表明是Microsoft编译器,它显然不是C99编译器。由于C99支持在其他类型的语句之后声明变量,您不能进行检查以确保argv[2]存在并且具有一个合理的数值吗?@Nathon:是的,我可以。我没有,并指出我没有。这样做意味着我的代码更像问题的代码。这是否足够重要以至于超过了教授“检查你的输入”的好处可能更值得商榷。当然,我看到你指出你没有这样做,我只是想确定这是可以做到的,因为以前检查这样的事情是违法的