1

问题是这样的。我希望能够使用数组表示法创建我的 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 以便它具有 40 个字符的 10 个字符串。我无法正确使用语法。

4

4 回答 4

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 指针分配 30 个字节的内存(30 个字节的字符数组)。

最后,您已经创建了 10 个字符数组。现在您可以像访问 char pargv[10][30] 一样访问 pargv;

于 2013-10-02T18:48:57.083 回答
0

如果您正在寻找一种简单的方法来声明 argv 并且不认为 argv 是一个双维数组(它不是,它是一个单维指针数组),那么

char* argv[] = {
"one", "two", "three", "four", 0};

会工作(忽略 const 问题)

于 2013-10-02T18:23:20.530 回答
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

于 2013-10-02T18:05:45.787 回答
0

它不起作用,因为myargv它不是指针,而是数组。此外,左值到右值的转换不适用于赋值。

于 2013-10-02T18:10:47.447 回答