Odebranie tablicy poprzez wskazniki

0

Witam!
Jakos nie potrafie sobie z tym poradzic.
Nie zdziwie sie jezeli ten blad jest w miare banalny. A wiec do rzeczy, przykladowy kod w C ( moze posiadac drobne bledy gdyz nie chcialem wklejac duzej ilosci kodu z orginalnego programu wiec troch pomodyfikowalem):

char ** func(char **tab_ws)
{
tab_ws = (char **)malloc(10*sizeof(char *));

for (p=0;p<=10;p++)
{
	char filename[20];
	sprintf(filename, "%s%d" ,"jakis_string" , liczba+p)  
	*(tab_ws+p)=filename;
	printf("\t%s",*(tab_ws+p)); 
}

return tab_ws;
}

main ()
{

char **tab_wsk;
tab_wsk=func(tab_wsk);

for(k=0;k<=10;k++)
{
printf("\n\n%s",*(tab_wsk+k));
}	

}

Problem polega w tym iz jezeli deklaruje sobie jakis string "filename" ktory powinien co petle przyjmowac wartosc jakis_string+liczba, gdzie liczba za kazdym ruchem petli jest zwiekszana. Do wskaznika tab_ws wrzucam wartosci np:

*(tab_ws+1)=string1;
*(tab_ws+2)=string2;

Wypisuje w kazdym ruchu petli wartosc jaka zostala wpisana i wygalda na prawidlowa.
Zwracam wowczas tab_ws i odbieram w main. Po wypisaniu kazdego ze wskaznikow mam wartosci te same. Dokladnie to tego pierwszego stringa. Natomiast jezeli dodam w petli tej "func" cos na styl *(tab_ws+1)="Ala" to wowczas po odebraniu w main mam pod zmienna tab_wsk string "Ala". Czemu wartosc filename nie jest zwracana a juz zwykly string tak.

Za bardzo nie wiem czy dobrze kombinuje. Chodzilo mi o to by w main dostepna byla tablica z funkcji z naszymi stringami.

Z gory dzieki.

0

Błędy:
-napisy (zmienna filename) alokowane statycznie(powinna być alokowana przez malloc) i dlatego nie są widoczne po wyjściu z funkcji
-do funkcji przekazujesz char**, które i tak zaraz zmieniasz za pomocą malloc(czyli tab_ws w main i tab_ws w funkcji wskazuje zupełnie gdzie indziej). Po co przekazujesz ten wskaźnik jako argument?
-nie zwalniasz pamięci

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

char ** func()
{
     char **tab_ws = (char **)malloc(10*sizeof(char *));
      int p;
      int liczba = 0;
      for (p=0;p<=10;p++)
      {
                tab_ws[p] = (char *)malloc(20*sizeof(char));
                sprintf(tab_ws[p], "%s%d" ,"jakis_string" , liczba+p); 
                printf("\t%s", tab_ws[p]);
      }

	return tab_ws;
}

main ()
{
      int k;
      char **tab_wsk;
      tab_wsk=func();
       
      for(k=0;k<=10;k++)
      {
             printf("\n\n%s",*(tab_wsk+k));
             free (tab_wsk[k]);
      }     
      free (tab_wsk);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1