Witam,
Probuje napisac program w C99 i potrzebuje ogarnac tablice lancuchow znakow (czyli tablice wskaznikow). Program wywala sie na free w peli for. Na chwile obecna nie rozumiem jaki blad popelniam zwalniajac pamiec. Sposob rozumowania przedstawilem w ostatnich komentarzach, bede wdzieczny za podpowiedz.
Pozdrawiam,
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main ()
{
char str[] ="test kolejny nastepny token token token";
char* tmp; // do tej zmiennej kopiuje lancuch str w celu przeliczenia
char* pch; // w celu operacji rozbijania na tokeny
tmp = malloc(sizeof(strlen(str)+1));
strcpy(tmp, str);
//
// poczatek liczenia tokenow
//
// informacja potrzebna do tego ile elementow tablicy
// dwuwymiarowej nalezy zwolnic
int ilosc_tokenow = 0;
pch = strtok(tmp," "); // spacja i tabulator
ilosc_tokenow++;
while (tmp != NULL)
{
tmp = strtok (NULL, " ");
ilosc_tokenow++;
}
//
// koniec liczenia tokenow
//
printf("Ilosc tokenow: %d\n", ilosc_tokenow);
//
// zapis tokenow do dynamicznej tablicy
//
// w tej tablicy argumentow trzymam swoje tokeny
// terminatorem, ostatnim elementem jest NULL
char** tablica_argumentow;
// dopiero teraz wiemy ile jest elementow i mozna zaczac wlasciwie alokowac pamiec
tablica_argumentow = malloc(ilosc_tokenow*sizeof(char)+1);
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," "); // spacja i tabulator
printf("%s", str);
// alokuje pamiec
*tablica_argumentow = malloc(sizeof(char)*(strlen(pch)+1));
// kopiuje token do zaalokowanej pamieci
strcpy(*tablica_argumentow, pch);
*tablica_argumentow++; // przejdz do nastepnego elementu w tablicy lancuchow
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ");
// alokuje pamiec
if(pch != NULL) {
*tablica_argumentow = malloc(sizeof(char)*strlen(pch)+1);
// kopiuje token do zaalokowanej pamieci
strcpy(*tablica_argumentow, pch);
printf("Wczytany element: %s\n", *tablica_argumentow);
}
// przechodzi do nastepnego elementu w tablicy tokenow
*tablica_argumentow++;
}
// ostatni element
// dopisujemy NULL
*tablica_argumentow = NULL;
printf("NULL dopisany.\n");
//
// koniec zapisu tokenow do dynamicznej tablicy
//
// zwolnij wczesniej zaalokowana pamiec
for(int i = 0, *tablica_argumentow; i < ilosc_tokenow; i++, *tablica_argumentow--) {
// dla kazdego zaalokowanego tokena wykonaj free
free(*tablica_argumentow);
}
// na koniec zwolnij glowny wskaznik
// free(tablica_argumentow);
return 0;
}