Fractionner la chaîne avec un séparateur en C – erreurs de segmentation, libre non valide

J’ai écrit un code simple pour scinder une chaîne en C avec un délimiteur. Quand je supprime tous mes frees, le code fonctionne très bien mais donne des memory leaks. Lorsque je ne supprime pas free, il ne montre pas les memory leaks, mais donne une erreur de segmentation. Qu’est-ce que wring et comment le résoudre?

#include  #include  #include  unsigned int countWords(char *ssortingngLine) { unsigned int count = 0; char* tmp = ssortingngLine; char* last = 0; const char delim = '/'; while (*tmp) { if (delim == *tmp) { count++; last = tmp; } tmp++; } return count; } char **getWordsFromSsortingng(char *ssortingngLine) { char** sizeNames = 0; unsigned int count = 0; const char *delim = "/"; count = countWords(ssortingngLine); sizeNames = malloc(sizeof(char*) * count); if(sizeNames == NULL) { return NULL; } if (sizeNames) { size_t idx = 0; char* token = strtok(ssortingngLine, delim); while (token) { if(idx > count) { exit(-1); } *(sizeNames + idx++) = strdup(token); token = strtok(0, delim); } if(idx == count - 1) { exit(-1); } *(sizeNames + idx) = 0; } return sizeNames; } void showWords(char *ssortingngLine) { unsigned int size = countWords(ssortingngLine), i = 0; char** sizeNames = getWordsFromSsortingng(ssortingngLine); for (i = 0; *(sizeNames + i); i++) { printf("word=[%s]\n", *(sizeNames + i)); free(*(sizeNames + i)); } printf("\n"); free(sizeNames); } int main() { char words[] = "hello/world/!/its/me/"; showWords(words); return 0; } 

    Variable sizeNames est un tableau de pointeurs, pas une chaîne (tableau de caractères) que vous devez terminer par un caractère nul.

    Alors supprimez ceci:

     *(sizeNames + idx) = 0; 

    Et changez ceci:

     for (i=0; *(sizeNames+i); i++) 

    Pour ça:

     for (i=0; i 

    Dans getWordsFromSsortingng,

      *(sizeNames + idx) = 0; 

    Écrit un après la fin de votre mémoire allouée, et lorsque vous essayez de la libérer, vous obtenez une erreur de segmentation. Essayez de compter + 1 dans le malloc:

     sizeNames = malloc(sizeof(char*) * (count+1) );