将char指针数组传递给函数

时间:2014-07-06 07:52:07

标签: 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中我得到了以下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 **&amp; a)这样的参数,并通过调用函数f(b)来实现这一点。但我想知道如果我使用char *** a想要发生的事情。它也应该工作。对不起,如果这是一个愚蠢的问题 任何关于上述问题的教程或参考将不胜感激 提前致谢。

2 个答案:

答案 0 :(得分:8)

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

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

您必须明确添加括号才能更改优先级:

(*a)[0] = ...

答案 1 :(得分:0)

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

(*a)[...]

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