指向指针的指针

6

我试图通过指向指针x的指针来设置指针p的内存。

int *p = 0;
int **x = &p;

*x = new int[2];

*x[0] = 1;  //p[0] = 1
*x[1] = 2;  //p[1] = 2

为什么会出现访问冲突错误导致失败?

6个回答

12

为什么会出现访问冲突错误?

[] 的优先级高于 * 。你需要先对 x 进行解引用操作。

(*x)[0] = 1;
(*x)[1] = 1;

但是当*x[0]被赋值时会发生什么? - user3234

5

我认为您的问题在于

*x[1]

解释

*(x[1])

而不是

(*x)[1]

这是您所需要的第二个版本; 它取消引用指针以获取底层数组,然后读取第二个元素。 您现在拥有的代码将双重指针视为指向指针数组的第二个元素的指针,在其中查找第一个指针,然后尝试取消引用它。 这不是您想要的,因为指针仅指向一个指针,而不是两个指针。 明确地加括号解决此问题。


2

很遗憾,类型安全系统在这里对你没有帮助。

x[0]和x[1]都是int*类型,所以你可以这样做

*(x[0]) = 1;  // allowed
*(x[1]) = 2;  // access violation, not through x[1] itself but by accessing it

当然,你的意图是什么。
 (*x)[0] = 1;
 (*x)[1] = 2;

2
在像*A[]这样的表达式中,变量A首先被索引,然后再被取消引用,而您需要恰好相反的操作,因此您需要编写(*A)[]

1

顺便提一下,您也可以尝试以这种方式访问由x指向的内存位置 -

x[0][0] = 1;
x[0][1] = 2;

是的,你可以这样做,但这意味着x是指向数组中第一个元素的指针,而实际上它是指向数组中第一个元素的指针的指针。 ;) - Mephane

1
你的问题在于你将p设置为0地址。实际上,你并没有为p(因此也包括x)分配任何空间。因此,你试图设置地址0和1处的内存。如果你将它改成这样,就可以避免错误了。
int *p = new int[5];
int **x = &p;

*x = new int[2];

(*x)[0] = 1;  //p[0] = 1
(*x)[1] = 2;  //p[1] = 2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接