Comment allouer dynamicment un tableau 2D de caractères?

Je veux allouer dynamicment un tableau 2D pour stocker des chaînes.

J’ai à l’origine déclaré le tableau comme ceci:

char lines[numlines][maxlinelength]; 

Cela me donne toutefois un débordement de stack lorsque numlines est très énorme.

Comment puis-je l’allouer dynamicment pour éviter le débordement de stack?

Essayez ce code:

 char **arr; int i; arr = malloc(numlines*sizeof(char*)); for (i = 0; i < numlines; i++) arr[i] = malloc(maxlinelength*sizeof(char)); 

Cela vous donnera un pointeur à pointeur, mais vous pouvez le gérer comme s'il s'agissait d'un tableau 2D.

Voir également ce lien très utile afin de comprendre ce que l'allocation dynamic pour les tableaux 2D fait réellement dans la mémoire.

Utilisez un pointeur sur un tableau:

 #define maxlinelength 10 char (*lines)[maxlinelength] = malloc( sizeof( char[maxlinelength] ) * numlines ) ; lines[0][0] = 'A' ; 

Cela nécessite que la taille la plus interne, maxlinelength , soit constante.

Vous pouvez éviter cette limitation si vous utilisez des pointeurs sur des tableaux de longueur variable, auquel cas la syntaxe rest la même et maxlinelength ne doit pas nécessairement être une constante. Les normes prenant en charge cette fonctionnalité sont C99 et éventuellement C11.

(Une constante est une variable dont la valeur est connue au moment de la compilation.)

(Et pour préciser: sizeof( *lines ) est identique à sizeof( char[maxlinelength] ) )

 char **lines = malloc(numlines * sizeof(*lines)); *lines = malloc(numlines * maxlinelength * sizeof(**lines)); size_t i; for (i = 1 ; i < numlines ; ++i) { lines[i] = *lines + i * maxlinelength; } 

Tout d'abord, vous allouez votre tableau, ensuite vous allouez toute la mémoire dont vous avez besoin, puis vous placez la bonne adresse dans chaque emplacement du tableau "principal".

Vous pouvez allouer un bloc de mémoire contigu avec les éléments suivants:

 const int numlines = 10; const int maxlinelength = 120; const int arrlen = sizeof(char) * numlines * maxlinelength; const char **lines = (const char**)malloc(arrlen); fprintf(stderr, "Allocated %d bytes\n", arrlen); 

Ajouter / supprimer const et typecasting selon les goûts.