将char指针数组传递给函数

Passing a char pointer array to a function

本文关键字:函数 数组 char 指针      更新时间:2023-10-16

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

#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中,我得到以下segfault。

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会发生什么。它也应该工作。对不起,如果这是一个愚蠢的问题。如有任何关于上述问题的指导或参考,我们将不胜感激。提前感谢。

这是因为操作符的优先级,其中数组索引操作符[]比解引用操作符*具有更高的优先级。

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

必须显式地添加括号来改变优先级:

(*a)[0] = ...

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

(*a)[...]

解引用'a',这是一个指针,这将给你一个数组