2010-06-01 33 views
8

Duplicar posibles:
casting char[][] to char** causes segfault?int ** vs int [FILAS] [COLS]

Tengo una matriz 2D declaró así:

int arr[2][2]={ {1,2},{3,4}}; 

Ahora bien, si Hago:

int ** ptr=(int**) arr; 

y:

cout<<**ptr; 

estoy recibiendo un fallo de segmentación (con g ++ - 4.0).

¿Por qué? ¿No debería estar imprimiendo el valor 1 (igual a arr[0][0])?

+3

Creo que hay una gran regla en C++: "Si se tienen que desechar, no se puede permitir" http://blogs.msdn.com/b/oldnewthing/archive/2009/10/23/9911891.aspx – SergGr

Respuesta

1

Está intentando asignar una variable de doble puntero a una matriz ... esto se ha cubierto exhaustivamente, consulte here para obtener información sobre esto. Además, puesto que declaró

 
int arr[2][2] = ...; 

y luego intenta asignar arr a un doble puntero

 
int ** ptr = ... ; 

que está garantizado para no trabajar, por lo tanto, un fallo de segmentación.Además, esa instrucción int ** ptr=(int**) arr; es realmente fundición un tipo (es decir [] []) a otro tipo (es decir **) a pesar de que son de tipo 'int'. Ambos son diferentes y el compilador que interpretarán de manera muy diferente ...

Usted puede hacerlo de esta manera:

 
int *ptr = &arr; 

Ahora *(ptr + 1) se referirá a la fila de orden 0, *(ptr + 2) se referirá al 1 'primera fila y así sucesivamente. La única responsabilidad es no sobrepasar los marcadores de donde se usa arr; de lo contrario, puede producirse un desbordamiento o incluso un error de segmentación ...

0

Trate

int *ptr = arr; 

Más Explicación:

Debe asignar una dirección al puntero, para que pueda ser derefenced (me refiero * operador). Lo que debes hacer es señalar a la celda de memoria que tiene la dirección a [0] [0]. Por lo tanto, obtienes una falla de segmentación.

5

No se puede convertir una matriz lineal en un tipo de puntero a puntero, ya que int** no contiene los mismos datos int[][]. El primero contiene punteros a punteros a ints. El segundo contiene una secuencia de entradas, en memoria lineal.

+0

Bueno, "puedes", como lo demuestra el PO. Solo tienes que hacer un reinterpret_cast, que el OP sin saberlo hizo porque están usando moldes de estilo c. Al igual que con todos los moldes, por supuesto, el resultado de acceder al nuevo puntero es UB. La moraleja que debería obtener OP es: usar moldes de C++ en C++. –

1

No, int ** es un puntero a un puntero a una int, pero una matriz 2-D es una matriz de matrices, y &(arr[0][0]) es un puntero a una int.

creo que debería estar haciendo esto:

int *ptr = arr; 
cout<<*ptr; 

o esto:

int *ptr = &arr[0][0]; 
cout<<*ptr; 
2

Lo que se hace hoy en día significa la creación de matrices de punteros donde cada puntero era fundido explícitamente. Por lo tanto, tendría una serie de punteros como (0x00001, 0x00002, 0x00003 and 0x00004).

Cuando se desreferencia, estos punteros provocan su segfault.

0

int arr[2][2] no es una matriz de matrices: es una única matriz de 2d. En la memoria, es indistinguible de int arr[4]

Lo que realmente quiere es

int (*ptr)[2] = arr; 
+0

Formalmente, * es * una matriz de matrices. Pero sí, dado que las matrices están dispuestas contiguamente sin ningún relleno permitido, un 'int [2] [2]' de hecho se presenta exactamente como un 'int [4]' en la memoria. – caf