我已经编写了以下示例代码来演示我的问题
#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
这真让我感到困惑。谁能解释我要去哪里错了。
我知道我可以传递像void f(char **&a)这样的参数并通过调用函数f(b)来实现这一目的。但是我想知道如果我使用char *** a会发生什么。它也应该起作用。抱歉,这是一个愚蠢的问题。
任何有关上述问题的教程或参考资料将不胜感激。
提前致谢。
这是因为运算符优先级,其中数组索引运算符的[]
优先级高于解引用运算符*
。
因此*a[0]
,从编译器的角度来看,表达式实际上与相同*(a[0])
,而这并不是您想要的。
您必须显式添加括号以更改优先级:
(*a)[0] = ...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句