c++ - 将 char 指针数组传递给函数

标签 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;
}

在这段代码中我发现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

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

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

最佳答案

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

所以表达式 *a[0] 实际上,从编译器的角度来看,与 *(a[0]) 相同,这不是什么你想要的。

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

(*a)[0] = ...

关于c++ - 将 char 指针数组传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24593796/

相关文章:

C 为什么我的代码中创建的线程数不一致?

java - 指向java中等效指针的指针

C 反转字符串

c++ - DebugDiag 调用堆栈不显示调用堆栈中函数的行号

C++ 异常处理和枚举作用域

c - 为什么要在 OpenMP 并行 block 内使用 OpenMP Single?

c - write vs fprintf - 为什么不同,哪个更好?

pointers - 根据 Ada 中的关键字创建对象并调用其方法

c++ - 给定 64 位虚拟地址空间,有什么理由不在堆栈上声明 32KB 数组?

c++ - 使用 CRTP 访问基类的 protected 成员