我正在尝试通过指向指针p
x
的内存
int *p = 0;
int **x = &p;
*x = new int[2];
*x[0] = 1; //p[0] = 1
*x[1] = 2; //p[1] = 2
为什么它因访问冲突错误而失败?
答案 0 :(得分:12)
为什么它因访问冲突错误而失败?
[]优先于*。您需要先解除引用x
(*x)[0] = 1;
(*x)[1] = 1;
答案 1 :(得分:5)
我认为你的问题是
*x[1]
平均值
*(x[1])
而不是
(*x)[1]
这第二个版本是你想要的;它取消引用指针以获取底层数组,然后读取第二个元素。您现在拥有的代码将双指针视为指向指针数组的第二个元素的指针,查找其中的第一个指针,然后尝试取消引用它。这不是你想要的,因为指针只指向一个指针而不是两个指针。明确括起此代码应解决此问题。
答案 2 :(得分:2)
在*A[]
之类的表达式中,变量A
首先被编入索引然后取消引用,而您想要完全相反,因此您需要编写(*A)[]
。
答案 3 :(得分: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;
答案 4 :(得分:1)
仅供参考,您也可以尝试以这种方式访问x
指向的内存位置 -
x[0][0] = 1;
x[0][1] = 2;
答案 5 :(得分: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