将char指针数组传递给函数

OMG*_*OMG 3 c c++ pointers

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

在这段代码中我发现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
Run Code Online (Sandbox Code Playgroud)

这真让我困惑.有人可以解释我哪里出错了.

我知道我可以传递像void f(char**&a)这样的参数,并通过调用函数f(b)来实现.但我想知道如果我使用char***a想要发生的事情.它也应该工作.对不起,如果这是一个愚蠢的问题.
任何关于上述问题的教程或参考将不胜感激.
提前致谢.

Som*_*ude 8

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

因此*a[0],从编译器的角度来看,表达式确实是相同的*(a[0]),这不是你想要的.

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

(*a)[0] = ...
Run Code Online (Sandbox Code Playgroud)

  • 实际上`*a [0]`有效,因为它是正确的!`*a [0]`和`(*a)[0]`都是'a [0] [0]` - 交换零周围没有区别.参看 `*a [1] == a [1] [0]`但是`(*a)[1] == a [0] [1]`. (2认同)