将char指针数组传递给函数

我写了以下示例代码来演示我的问题

#include  #include  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中我得到了以下seg错误。

 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想要发生的事情。 它也应该工作。 对不起,如果这是一个愚蠢的问题。
任何关于上述问题的教程或参考将不胜感激。
提前致谢。

这是因为运算符优先级 ,其中数组索引operator []优先级高于解除引用运算符*

因此,从编译器的角度来看,表达式*a[0]实际上与*(a[0]) ,这不是您想要的。

您必须显式添加括号才能更改优先级:

 (*a)[0] = ... 

a [0],a [1]是char,它们中有一个值,取消引用该值显然会导致分段错误。 你可能想做的是:

 (*a)[...] 

取消引用’a’这是一个指针,这将给你一个数组。