我正在尝试设置指针的内存p
通过指针的指针x
指针的指针
int *p = 0;
int **x = &p;
*x = new int[2];
*x[0] = 1; //p[0] = 1
*x[1] = 2; //p[1] = 2
它为什么失败,并访问冲突错误?
我正在尝试设置指针的内存p
通过指针的指针x
指针的指针
int *p = 0;
int **x = &p;
*x = new int[2];
*x[0] = 1; //p[0] = 1
*x[1] = 2; //p[1] = 2
它为什么失败,并访问冲突错误?
为什么它会因访问冲突错误而失败?
[]优先于*。您需要先取消引用x
(*x)[0] = 1;
(*x)[1] = 1;
我觉得你的问题是,
*x[1]
手段
*(x[1])
而且不
(*x)[1]
这第二个版本是你想要的;它取消引用指针以获取底层数组,然后读取第二个元素。你现在的代码把你的双指针当作指向数组指针的第二个元素的指针,查找它中的第一个指针,然后尝试对它进行解引用。这不是你想要的,因为指针只指向一个指针,而不是两个。明确地将这段代码括起来应该解决这个问题。
仅供参考,您也可以尝试以这种方式访问由x
指出的存储位置太 -
x[0][0] = 1;
x[0][1] = 2;
在像*A[]
变量A
表达的第一个索引,然后取消引用,并且要完全相反,所以你需要写(*A)[]
。
不幸的是,类型安全系统在这里没有帮助。
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;
你的问题是,你已经设置的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
不错,谢谢,我明白了。 – user3234 2011-02-17 10:03:25
但是当* x [0]被分配给一个值时会发生什么? – user3234 2011-02-17 10:15:09