我有以下代码:
作为全球变量:
char *orderFiles[10];
然后是我的主要方法:
int main(int argc, char *argv[])
{
orderFiles = argv;
}
然而它一直给我一个错误。我做错了什么?
答案 0 :(得分:2)
它给你一个错误,因为char *x[10]
给你一个十个不可修改的char指针的数组。换句话说,您不能分配给x
,也不能以任何方式更改它。等效的可更改版本为char **orderFiles
- 您可以将argv
分配给该版本。
顺便说一句,你可以将单个参数传递给你的数组:
for (i = 0; i <= argc && i < sizeof(orderFiles)/(sizeof(*orderFiles); i++)
orderFiles[i] = argv[i];
但这似乎相当复杂。它将使用第一个orderFiles
参数填充N
或部分填充它,使下一个为NULL。
如果您的意图只是将参数存入全局,以便您可以在任何地方引用它们,那么您应该执行以下操作:
#include <stdio.h>
char **orderFiles;
int orderCount;
static void someFn (void) {
int i;
printf ("Count = %d\n", orderCount);
for (i = 0; i < orderCount; i++)
printf ("%3d: [%s]\n", i, orderFiles[i]);
// or, without orderCount:
// for (i = 0; orderFiles[i] != NULL; i++)
// printf ("%3d: [%s]\n", i, orderFiles[i]);
// printf ("Count was %d\n", i);
}
int main (int argc, char **argv) {
orderCount = argc;
orderFiles = argv;
someFn();
return 0;
}
该代码将参数保存到全局变量中,以便可以在不同的函数中访问它们。
如果你想使用main
,你应该将这两个参数保存到argc
,尽管从技术上讲,由于托管环境argv[argc]
保证为NULL,所以没有必要 - 你可以用它来检测参数数组的结尾。
答案 1 :(得分:0)
orderFiles是const char **
,你不能修改它(数组指针本身)。
您可以尝试分配数组成员(即orderFiles [0] = argv [0]等)。
答案 2 :(得分:0)
问题是在没有长度的情况下初始化的数组与用1初始化的数组之间存在差异。从全局变量声明中删除10,然后它应该工作
原因是argv实际上只是一个char * * ,但orderFiles是一个10 char *的数组。
答案 3 :(得分:0)
char**
是隐式orderFiles
,但它是常量,因为您通过指定大小[10]
将其初始化为链接时间分配的内存块。您应该从char**
为您的数组创建一个非常数memcpy
或argv
。
答案 4 :(得分:0)
就像他们都说两种不同的数据类型一样。换句话说就是这样想:argv是一个c-strings数组,你的orderFiles被声明为一个c-string。
那么如何分配orderFiles取决于你想要做什么。我通常遍历argv以获取传递给应用程序的参数。请注意,argv [0]是应用程序名称。