将指向字符的指针分配给C中的字符矩阵

时间:2013-10-02 18:03:44

标签: c++ c pointers matrix-indexing

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

4 个答案:

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

最后,您已经创建了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问题)