C 从命令行参数分配数组
我正在开发一个小型C应用程序,并从命令行捕获一个值。我希望捕获该值并使用它初始化数组。这就是我要做的C 从命令行参数分配数组,c,arrays,C,Arrays,我正在开发一个小型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[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:是的,我可以。我没有,并指出我没有。这样做意味着我的代码更像问题的代码。这是否足够重要以至于超过了教授“检查你的输入”的好处可能更值得商榷。当然,我看到你指出你没有这样做,我只是想确定这是可以做到的,因为以前检查这样的事情是违法的