0
votes

Pourquoi un tableau 2-D provoque-t-il une faute SEG, et une autre ne pas?

Il existe plusieurs façons de définir une matrice 2-D.

et j'ai découvert que lorsque vous définissez un tableau à l'aide du code ci-dessous: P>

int** arr = new int*[2];
for(int i = 0; i < 2; i++) arr[i] = new int[2];
cout << arr[3][3];


0 commentaires

3 Réponses :


1
votes

Les tableaux statiques sont situés dans la pile afin qu'il ne puisse pas segfault puisque le programme peut accéder à sa propre pile. Cependant, vous pouvez segfault un tableau statique si vous sortez de la plage de la pile.

Un tableau dynamique (pointeur) d'autre part est situé dans le tas. Donc, en sortant hors de portée, vous demandez d'obtenir un pointeur en dehors de vos emplacements de mémoire dédiés de votre programme, ce qui entraîne un segfault.

Ceci s'appelle un comportement non défini .


0 commentaires

3
votes

lire des valeurs non initialisées est comportement non défini . Votre programme est invalide (les deux variantes) et a aucune signification lorsque vous le faites et tout comportement est autorisé. Le compilateur est littéralement autorisé à faire n'importe quoi . Vous ne pouvez pas raisonner sur un programme contenant UB, n'essayez même pas.


0 commentaires

0
votes

Vous avez un comportement indéfini. Tout peut arriver. Il n'est pas utile de spéculer pourquoi vous obtenez ces résultats.

Cela dit, c'est probablement ce qui se passe:

Le premier est un bloc de mémoire continue (2 * 2 * Tailleof (int)) sur votre pile, où arr [3] [3] [3] signifie lire des données de 3 * 3 * Tailleof ( int) octets après le début de ce bloc.

L'autre est un bloc de mémoire (2 * Tailleof (int *)) sur le tas contenant deux pointeurs pointant sur deux blocs de mémoire distincts sur le tas (chaque 2 * Tailleof (int)), où arr. [3] [3] signifie lire des données de 3 * Tailleof (int *) octets après ce premier bloc de mémoire, interprétez tout ce que vous trouverez comme une adresse mémoire, puis de lire des données de 3 * Tailleof (int) octets après cette adresse.


0 commentaires