Dupliqué possible: strong>
Char Char [] [] à char ** causes SEGFAULT? P >J'ai un tableau 2D déclaré comme ceci: p>
xxx pré> maintenant si je le fais: p>
xxx pré> et: < / p>
xxx pré> Je reçois une défaillance de segmentation (à l'aide de g ++ - 4.0). P>
Pourquoi donc? Ne devrait-il pas imprimer la valeur 1 (égale à
arr [0] [0] code>)? P> blockQquote>
6 Réponses :
ESSAYEZ
int *ptr = arr;
Vous ne pouvez pas lancer de matrice linéaire à un type pointeur à pointeur, car int ** code> ne contient pas les mêmes données int [] [] code> 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. P>
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 ++.
non, Je crois que vous devriez faire cela: p> ou ceci: p> int ** code> est un pointeur sur un pointeur sur un intox, mais un tableau 2-D est une matrice de tableaux et & (arr [0] [0] ) code> est un pointeur à un int.
Ce que vous faites maintenant signifie la création de tableaux de pointeurs où chaque pointeur était quand il est déréférencé, ces pointeurs causent votre segfault. em> p> 0x00001, 0x00002, 0x00003 et 0x00004 code>). p>
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;
Ce que vous voulez vraiment est p> int arr [2] [2] code> 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] code>
Formellement, il est i> 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] code> est bien défini comme un int [4] code> en mémoire.
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