9
votes

int ** vs int [rangées] [cols]

Dupliqué possible:
Char Char [] [] à char ** causes SEGFAULT?

J'ai un tableau 2D déclaré comme ceci: xxx

maintenant si je le fais: xxx

et: < / p> xxx

Je reçois une défaillance de segmentation (à l'aide de g ++ - 4.0).

Pourquoi donc? Ne devrait-il pas imprimer la valeur 1 (égale à arr [0] [0] )?

c c++

1 commentaires

Je pense qu'il y a une grande règle en C ++: "Si vous devez vous lancer, vous ne pouvez pas vous le permettre" blogs.msdn.com/b/oldnewthing/archive/2009/10/23/9911891.aspx


6 Réponses :


0
votes

ESSAYEZ

int *ptr = arr;


0 commentaires

5
votes

Vous ne pouvez pas lancer de matrice linéaire à un type pointeur à pointeur, car int ** ne contient pas les mêmes données int [] [] Est-ce que. Le premier détient des pointeurs-à-pointeurs-to-ints. La seconde détient une séquence d'INTS, en mémoire linéaire.


1 commentaires

Eh bien, vous "pouvez", car l'OP démontre. Il vous suffit de faire une réinterpret_cast, que l'OP inconsciemment fait parce qu'ils utilisent des moulages de style C. Comme pour toutes les telles lancées, le résultat de l'accès du nouveau pointeur est l'UB. La morale que l'OP devrait être obtenu est la suivante: Utilisez C ++ CASTS EN C ++.



1
votes

non, int ** est un pointeur sur un pointeur sur un intox, mais un tableau 2-D est une matrice de tableaux et & (arr [0] [0] ) est un pointeur à un int.

Je crois que vous devriez faire cela: xxx

ou ceci: xxx < / pré>


0 commentaires

2
votes

Ce que vous faites maintenant signifie la création de tableaux de pointeurs où chaque pointeur était explicitement casted . Par conséquent, vous auriez une gamme de pointeurs comme ( 0x00001, 0x00002, 0x00003 et 0x00004 ).

quand il est déréférencé, ces pointeurs causent votre segfault.


0 commentaires

2
votes

Vous essayez d'attribuer une double variable de pointeur à un tableau ... Ceci a été recouvert de manière exhaustive, voir ici pour des informations à ce sujet. De plus, puisque vous avez déclaré

int *ptr = &arr;


0 commentaires

0
votes

int arr [2] [2] n'est pas un tableau de matrices - il s'agit d'un tableau 2D unique. En mémoire, il est indiscernable de int arr [4]

Ce que vous voulez vraiment est xxx


1 commentaires

Formellement, il est un tableau de matrices. Mais oui, puisque les tableaux sont conçus de manière contiguë sans aucun rembourrage autorisé, un int [2] [2] [2] est bien défini comme un int [4] en mémoire.