问题是这个。我希望能够使用数组表示法创建我的argv:
char myargv[10][30];
然而,尽管能够以逻辑方式对待它们,但主要功能仍然期望** char:
int main(int argc, char **argv)
{
printf("%s\n",argv[0]);
return 0;
}
但是在我的代码中尝试以下内容不会起作用:
char myargv[10][30];
char **pargv = myargv;
有人可以澄清吗?我也试过了一些其他的排列,例如pargv = myargv [0] [0]等,没有成功。
编辑: 如果这被证明是不可能的,我概述的方式可以帮助我使用malloc调用初始化char ** myargv,以便它有10个40个字符的字符串。我无法正确使用语法。
答案 0 :(得分:1)
这不起作用
char **pargv = &myargv[0][0];
背后的原因是当你尝试访问/打印pargv [1]时,它不知道从初始位置跳过多少字节。
相反,你应该这样写。
char (*pargv)[30] = &myargv[0][0]; \\we have created a pointer to a charater array of size 30
如果您尝试访问pargv [1],请立即查看,编译器知道必须跳转30个字节才能访问该位置。
即使这是可能的,人们也会动态分配,因为它看起来清晰易懂。
以下代码应该有效。
char ** pargv;
pargv = (char **)malloc(10*sizeof(char *));
for(int i=0;i<10;i++)
{
pargv[i]=(char *)malloc(30*sizeof(char));
}
上面的代码就像这样。
最后,您已经创建了10个字符数组。 现在你可以像访问char pargv [10] [30];
一样访问pargv答案 1 :(得分:0)
char myargv[10][30];
char **pargv1 = myargv; // Error, in an expression array is converted to pointer
char (*pargv2)[30] = myargv; // OK, pointer to an array 30 of char
pargv1
是指向char
的指针。
myargv
是一个char
数组的数组。评估时,它将转换为指向30
的数组char
的指针。
答案 2 :(得分:0)
它不起作用,因为myargv
不是指针,它是一个数组。此外,左值到右值的转换不适用于赋值。
答案 3 :(得分:0)
如果你正在寻找一种简单的方法来声明argv,并且没有挂断argv是一个双维数组的想法(它不是,它是一个单一维度的指针数组),那么
char* argv[] = {
"one", "two", "three", "four", 0};
会起作用(忽略const问题)