Problème fonction realloc
Hello !
J'apprends les pointeurs et je viens d'apprendre quelques notions sur l'allocation dynamique également.
Je réalise un exercice pour lequel j'ai créé une structure, au sein de laquelle se trouve un tableau de pointeurs vers des chaines de caractères. Le nombre de chaines de caractères pouvant varier, je dois pouvoir rajouter de manière dynamique des pointeurs dans mon tableau (je le fais dans une fonction et non pas dans le main, en passant à la cette fonction le pointeur de ma structure). J'essaie d'utiliser la fonction realloc mais sans succès : le programme plante et affiche le message "exe has triggered a breakpoint" (à la ligne 30 dans le code ci-dessous)...
Une bonne âme pourrait-elle m'expliquer mon erreur ? J'ai dû mal comprendre certaines notions...
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
void AjoutMessage(struct etGMessage *pGMessage)
{
/************************************************************************************************/
/* sMessage : variable dans laquelle on stockera le message du programme utilisateur. */
/* dLongueurMessage : variable qui permettra de stocker la longueur de la chaine de caractères. */
/* **pPointeurTableau : double pointeur pointant vers l'entièreté du tableau de pointeurs. */
/************************************************************************************************/
char sMessage[100];
int dLongueurMessage;
char **pPointeurTableau = pGMessage->tMessages;
/*******************************************************************************************/
/* D'abord, on regarde s'il reste de la place dans le gestionnaire de messages. */
/* Si le gestionnaire est plein, il faut agrandir la zone mémoire du tableau de pointeurs. */
/*******************************************************************************************/
if (pGMessage->dNextFreeCell == pGMessage->dTableSize)
{
/******************************************************************************************************************/
/* On incrémente la variable contenant la taille du tableau de pointeurs. */
/* On réalloue au double pointeur pointant vers le tableau de pointeurs de la mémoire : */
/* on multiplie par la nouvelle taille du tableau de pointeurs le nombre de bytes que prend un pointeur sur char. */
/******************************************************************************************************************/
pGMessage->dTableSize++;
pPointeurTableau = (char**)realloc(pPointeurTableau, pGMessage->dTableSize * sizeof(char*));
}
/************************************************/
/* On réceptionne ensuite le message à stocker. */
/************************************************/
printf("Message a ajouter au gestionnaire :\n");
gets_s(sMessage);
/*********************************************************/
/* On calcule la longueur de cette chaine de caractères. */
/*********************************************************/
dLongueurMessage = strlen(sMessage);
/***************************************************************************************************************/
/* On alloue de manière dynamique de la mémoire (taille = longueur de la chaine de caractères + 1 pour le \0.) */
/* On spécifie avant la fonction malloc que c'est un pointeur char*. */
/* Le sizeof(char) est omis car il est égal à 1. */
/***************************************************************************************************************/
pGMessage->tMessages[pGMessage->dNextFreeCell] = (char*)malloc(dLongueurMessage + 1);
/**********************************************************************************/
/* On copie notre chaine de caractères dans cet espace mémoire nouvellement créé. */
/**********************************************************************************/
strcpy(pGMessage->tMessages[pGMessage->dNextFreeCell], sMessage);
/*************************************************************************************/
/* On incrément l'index pointant vers le prochain emplacement libre du gestionnaire. */
/*************************************************************************************/
pGMessage->dNextFreeCell++;
} |
Apparemment, je devrais vérifier que la fonction realloc a bien fonctionné (elle ne ramène pas la valeur "NULL"). Mais ici je ne sais même pas le vérifier, étant donné que la fonction plante...
Merci à ceux qui pourront m'aider !