我正在处理一个小型C应用程序,我正在从命令行捕获一个值。我想捕获值并使用它来初始化数组。这就是我想要做的。
int main(int argc, char* argv[]) {
int option = atoi(argv[2]);
int values[option];
......
}
我正在编译,因为我的选项变量不是const。 错误:错误2错误C2057:预期的常量表达式
我有办法做到这一点吗?
感谢您的帮助!
答案 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
”中的类型名称。