传递char **作为参数

时间:2015-12-02 12:06:46

标签: c++ multidimensional-array

为什么这段代码不起作用? 我有一些旧代码,并且不想在堆中分配a

void test(char **str) {
   cout << str[0] << endl;
   cout << str[1] << endl;
}

int main(int argc, char* argv[]) {
    char a[2][5];
    strcpy(a[0],"abc");
    strcpy(a[1],"def");

    char *str1 = (char *)a;
    test(&str1);

    return 0;
}

3 个答案:

答案 0 :(得分:5)

此代码不起作用,因为指向char的指针char的2 x 5数组相同,有或没有强制转换:< / p>

  • 指向指针的指针可以用作指针数组,即可以使用*运算符取消引用其元素
  • 一个2乘5阵列由十个项目组成,每个项目分为两行,每行五个项目。这些项目都不是可以解除引用的指针。

以下是如何构建与char**兼容的数组:

char a[2][5];
strcpy(a[0],"abc");
strcpy(a[1],"def");

char *str1[] = { a[0], a[1] };
test(str1);

现在str1是一个char指针数组,有两个项目。第一项是包含a[0]地址的指针;第二项是包含a[1]地址的指针。指针数组可以传递给期望指向指针的函数,因此test()函数可以正常工作。

Demo.

答案 1 :(得分:1)

为什么?

因为char a[2][5]是一个存储为10个连续字符的二维数组。但是参数char **str需要一个指向一维字符数组的指针数组。

enter image description here

解决方案1:

保持函数原样,但将一个指针数组传递给char:

...
char *str1[2];
str1[0]=a[0];
str1[1]=a[1];
test(str1); 

解决方案2:

选择函数接受在secund维度中包含5个元素的2D数组(要传递n维数组,必须预定义最后的n-1维度):

void test(char str[][5]) {
    ...
}
int main() {
    ...
    test(a);
}

不便之处在于灵活性较差。

解决方案3

如果您的问题与字符串数组特别相关,而不是二维数组更常见的问题,请从char*切换到std::string,这样可以让您的生活更轻松!

void test(string str[]) {
   ...
}
int main(int argc, char* argv[]) {
    string a[2] ={ "abc","def" };
    test(a);
}

答案 2 :(得分:0)

由于您使用的是C ++,因此可以将test函数更改为以下内容:

template <int cols> void test(char arr2d[][cols]){
    /* whatever */
}

然后您在程序中将a作为参数(例如test(a))调用它,而不进行任何转换或其他类型的转换。