2011-02-17 38 views
6

Estoy intentando configurar la memoria de puntero p través puntero a puntero del xpuntero a un puntero

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

*x = new int[2]; 

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

¿por qué se produce el error de acceso violación?

Respuesta

12

¿por qué falla con el error de violación de acceso?

[] tienen prioridad sobre *. Es necesario que primero eliminar la referencia x

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

Agradable, gracias. – user3234

+0

Pero, ¿qué sucede cuando * x [0] se asigna a un valor? – user3234

5

Creo que su problema es que

*x[1] 

Medios

*(x[1]) 

Y no

(*x)[1] 

Esta segunda versión es lo que quiere ; Desreferencia el puntero para obtener la matriz subyacente, luego lee el segundo elemento. El código que ahora trata su doble puntero como un puntero al segundo elemento de una matriz de punteros, busca el primer puntero y luego intenta desreferenciarlo. Esto no es lo que quiere, ya que el puntero solo apunta a un puntero, no a dos. Al hacer una paréntesis explícita de este código, esto debería resolverse.

1

FYI, También puede intentar acceder a posiciones de memoria apuntadas por x de esta manera también -

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

Sí, puede, pero eso sugiere que 'x' es un puntero al primer elemento de una matriz, mientras que en cambio es un puntero a un puntero al primer elemento de una matriz. ;) – Mephane

2

En la expresión como *A[] la variable A se indexa primero y luego elimina la referencia, y que desea exactamente lo contrario, por lo que debe escribir (*A)[].

2

Lamentablemente, el sistema de seguridad no lo ayuda aquí.

x [0] y x [1] son ​​tanto de tipo int * para que pueda hacer

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

Por supuesto, su intención fue

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

Su problema es que se han establecido p a la dirección de 0. En realidad, no ha asignado ningún espacio para p (y por lo tanto x). Por lo tanto, está intentando configurar la memoria en la dirección 0 y 1. Si la cambia a esto, debería funcionar sin el error.

int *p = new int[5]; 
int **x = &p; 

*x = new int[2]; 

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