allouer de la mémoire à un tableau de caractères 2d à la volée

voix
-1

Je suis en train d'allouer la mémoire à un tableau de caractères 2d comme je déterminer sa taille. (Le nombre est supposé être une valeur inconnue) il semble fonctionner jusqu'à ce que quelque chose commence à réaffecter des données de déchets au tableau

0xd28fe280 -> 3
0xd28fe280 -> 3
0xd28fe280 -> 3
0xd28fe280 -> 3
0xd28fe280 -> ���[U
0xd28fe280 -> ���[U

ce essentiellement ce que je veux faire est allouer de la mémoire juste avant que je remplir le tableau avec des chaînes.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
  int count = 6;
  char **words;
  words = malloc(0);
  for(int i = 0;i < count; i++){
    words[i] = malloc(10);
    strcpy(words[i],3);
    printf(%#08x -> %s\n,words[0],words[0]);
  }
  free(words);
  return 0;
}
Créé 07/11/2018 à 20:09
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
1

Il est en fait pas un tableau 2D, il est un pointeur vers un pointeur de caractère ( char **).

wordspointer vers un bloc d' char *où chaque élément de ce point de bloc à un charbloc. Vous avez seulement alloué la mémoire pour les charblocs, mais pas pour le char *bloc. (Vous avez alloué avec la taille 0 de sorte que vous ne pouvez pas y accéder). Vous devez également libérer tous les blocs que vous avez alloué, sinon la mémoire est une fuite. Il serait également bon de vérifier la valeur de retour malloc, car elle retourne NULLsi elle échoue et déréférencement en outre un NULLpointeur conduira à un comportement non défini.

Cela devrait fonctionner:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int count = 6, max_len = 10, words_n = 0;
    char **words = NULL;

    for(int i=0; i<count; i++)
    {
        words = realloc(words, ++words_n * sizeof *words);
        if(!words)
        {
            //Error handling
            return -1;
        }
        words[i] = malloc(max_len * sizeof *words[i]); 
        if(!words[i])
        {
            //Error handling
            return -1;
        }
        strncpy(words[i], "3", max_len); //Better to protect against overflows.
        words[i][max_len-1] = '\0';
        printf("%p -> %s\n", (void*)words[0], words[0]); //"%p" for printing pointers.
    }

    for(int i=0; i<count; i++)
    {
        free(words[i]); //Free every allocated element.
    }
    free(words);

    return 0;
}
Créé 08/11/2018 à 15:17
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more