将一个字符指针数组传递给函数

3
我已经编写了以下示例代码来演示我的问题。
#include <iostream>
#include <string.h>

using namespace std;

void f (char*** a)
{
    *a = new (char*[2]);
    *a[0] = new char[10];
    *a[1] = new char[10];
    strcpy(*a[0], "abcd");
    strcpy(*a[1],"efgh");
}

int main ()
{
    char** b = NULL;
    f(&b);
    cout<<b[0]<<"\n";
    cout<<b[1]<<"\n";
    return 1;
}

在这段代码中,我发现a = new (char[2]);没有为*a[1]分配内存。

在gdb中,我得到了以下的段错误。

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400926 in f (a=0x7fffffffdfe8) at array1.cpp:10
10          *a[1] = new char[10];
(gdb) p *a[1]
Cannot access memory at address 0x0

这真的让我很困惑。有人能解释一下我做错了什么吗?

我知道可以像这样传递参数:void f(char**& a),通过调用函数f(b)来实现,这个方法是可行的。但如果我使用char*** a会发生什么呢?它应该也可以工作。如果这是一个愚蠢的问题,那我很抱歉。
如果有任何关于上述问题的教程或参考资料,将不胜感激。
谢谢。


我真的希望这只是一个更多或少是学术问题,并且您正在生产代码中使用std::vector<std::string>等... :) - Christian Hackl
2个回答

8
这是因为运算符优先级,其中数组索引操作符[]的优先级高于解引用操作符*
因此,表达式*a[0]从编译器的角度来看实际上与*(a[0])相同,而这不是您想要的。
您必须显式添加括号来更改优先级:
(*a)[0] = ...

#include <iostream> #include <string.h>using namespace std;void f (char*** a) {*a = new (char*[2]); (*a)[0] = new char[10]; (*a)[1] = new char[10]; strcpy((*a)[0], "Saurab"); strcpy((*a)[1],"srivastav");}int main () { char** b = NULL; f(&b); cout<<b[0]<<"\n"; cout<<b[1]<<"\n"; return 1; } 现在它可以工作了。 - SaurabhS
2
实际上 *a[0] 是正确的! *a[0](*a)[0] 都是 a[0][0] - 交换零点没有任何区别。参见 *a[1] == a[1][0] 但是 (*a)[1] == a[0][1] - M.M

0

a[0]和a[1]是字符,它们有一个值,对该值进行解引用显然会导致分段错误。你可能想要做的是:

(*a)[...]

解除 'a' 的指针引用,这将给您一个数组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接