L’allocation de mémoire dynamic d’un tableau 2D se bloque

Dupliquer possible:
Comment configurer, accéder et libérer correctement un tableau multidimensionnel en C?

J’essaie d’allouer dynamicment de la mémoire pour un tableau 2D à l’aide de calloc. Les colonnes sont fixées à 2, de sorte que seules les lignes dynamics.

Voici ce que j’ai essayé:

unsigned int **pts, rows; int main() { //some code pts = (unsigned int **)calloc(2*rows, sizeof (unsigned int **)); } //The code to access the array : for(k=1;k<=i;k++) { printf("\nX%d=",k); scanf("%d",&pts[k][0]); printf("\nY%d=",k); scanf("%d",&pts[k][1]); } 

Mais le problème est que, tout en accédant à la masortingce, le programme se bloque. J’utilise Eclipse avec MinGW GCC.

S’il vous plaît, faites-moi savoir si j’ai besoin de mettre plus de données ici ou donnez-moi une idée de la façon dont je peux gérer cela, car c’est mon premier message.

La réponse de Tudor est la bonne solution. Mais pour donner un peu plus d’explications sur la raison pour laquelle votre code est erroné …

En réalité, votre code consiste simplement à allouer un tableau de longueur 2 * lignes, de pointeur à pointeur pour taper int.

Ce que vous essayez de créer est le suivant:

 an array of int** -> int* -> int -> int -> int -> ...more -> int* -> int -> int -> int -> ...more -> int* -> int -> int -> int -> ...more -> ...more 

Voici ce que vous avez créé:

 an array of int** -> int* -> nothing (null address) -> int* -> nothing... -> ...more 

Vous essayez ensuite d’affecter un int à l’une des adresses null pointées par l’un des int * initialisés à zéro dans votre tableau d’ int ** (vous voyez, calloc s’est assuré que tous vos int * sont à zéro)

Quand vous essayez d’exécuter

 scanf("%d",&pts[k][0]); 

pts [k] fait référence au (k – 1) ème élément de votre tableau d’ int **, mais comme indiqué ci-dessus, bien que votre code ait alloué de la place pour cet élément, il l’a initialisé à zéro. Donc, ceci pts [k] pointe sur NULL. Donc, scanf a obtenu une adresse basée sur un décalage de zéro à partir de l’adresse NULL … Il devrait maintenant être clair pour vous que cela est invalide.

Voici le moyen de le faire:

 pts = (unsigned int **)calloc(rows, sizeof (unsigned int *)); for(int i = 0; i < rows; i++) { pts[i] = (unsigned int *)calloc(2, sizeof (unsigned int)); }