[c] przekazanie i zwrot przez funkcje tablicy stringów...

0

Witam,
potrzebowałbym przekazać tablicę stringów przekazać do funkcji, w funkcji przepisać ją na inną tablicę stringów i tą inną tablicę stringów zwrócić do main... W kodzie mam dużo niepotrzebnych rzeczy ale to po to żebym widział co i gdzie i czy jest przekazane...

Dodam że jak w

char funkcja(char *argg[])

dodam "*" przed "funkcja"

char *funkcja(char *argg[])

To w main mam przekazane dwa pierwsze elementy tablicy...
Jestem początkujący...

Tutaj cały kod w którym próbuję przekazać te tablice...

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

char funkcja(char *argg[])
{
    char *tab[4];
    printf("w funkcji %s %d\n", argg[0], strlen(argg[0]));
    printf("w funkcji %s %d\n", argg[1], strlen(argg[1]));
    printf("w funkcji %s %d\n", argg[2], strlen(argg[2]));
    printf("w funkcji %s %d\n\n", argg[3], strlen(argg[3]));

    tab[0] = (char*)malloc(sizeof(char)*strlen((argg[0])+1));
    tab[1] = (char*)malloc(sizeof(char)*strlen((argg[1])+1));
    tab[2] = (char*)malloc(sizeof(char)*strlen((argg[2])+1));
    tab[3] = (char*)malloc(sizeof(char)*strlen((argg[3])+1));

    strcpy(tab[0], argg[0]);
    strcpy(tab[1], argg[1]);
    strcpy(tab[2], argg[2]);
    strcpy(tab[3], argg[3]);

    printf("po przepisaniu %s %d\n", tab[0], strlen(tab[0]));
    printf("po przepisaniu %s %d\n", tab[1], strlen(tab[1]));
    printf("po przepisaniu %s %d\n", tab[2], strlen(tab[2]));
    printf("po przepisaniu %s %d\n\n", tab[3], strlen(tab[3]));

    return tab;
}

int main()
{
    char **tab, *argg[] = {"cos1", "cos2", "cos3", "cos4"};

    printf("%s %d\n", argg[0], strlen(argg[0]));
    printf("%s %d\n", argg[1], strlen(argg[1]));
    printf("%s %d\n", argg[2], strlen(argg[2]));
    printf("%s %d\n\n", argg[3], strlen(argg[3]));

    tab = funkcja(argg);

    printf("koniec %s %d\n", tab[0], strlen(tab[0]));
    printf("koniec %s %d\n", tab[1], strlen(tab[1]));
    printf("koniec %s %d\n", tab[2], strlen(tab[2]));
    printf("koniec %s %d\n\n", tab[3], strlen(tab[3]));

    printf("\n\nHello world!\n");
    return 0;
}
2
char **tab;
tab = funkcja(argg);

już te 2 linijki sugerują, że to co zwraca funkcja() powinno być tego samego typu co tab, czyli char**.

Natomiast ten kod nie zadziała (nawet z char**), dlatego że

char *tab[4];

to jest statyczna, lokalna tablica 4 elementów typu char*. Jako że ona jest lokalna, to zniknie po wyjściu z funkcji, więc jeśli przekazujesz wskaźnik do niej to potem będziesz się odwoływać do nieistniejącej tabeli. Rozwiązanie - sama tablica też musi być dynamicznie alokowana:

char **tab;
tab = malloc(4 * sizeof(char*));

A, i oczywiście na każdy malloc powinieneś mieć odpowiednie free.

1

do tego co napisał @twonek dobrą zasadą jest - jeśli tworzysz funkcje, która przydziela pamięci zwraca obiekt, który musi zwolnic pamięć, twórz funkcje zwalniającą - dziś użyjesz malloc free - ale jutro może być potrzebna jakaś inna i poszukiwania później gdzie użyte zostało free w kontekście danych przydzielonych przez Twoją funkcję. Dodatkowo ktoś kto skorzysta z Twojego API nie będzie musiał się zastanawiać, jak zwolnić to co zostało po wywołaniu funkcji.

0

Dziękuję bardzo za podpowiedzi Panowie i odnośnie mojego problemu i odnośnie zwalniania pamięci, przyda się na pewno. Jeszcze tylko kod do ewentualnego sprawdzenia podrzucę (bez zwalniania pamięci ale pamiętam ;) )...

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

char *funkcja(char *argg[])
{
    char **tab;

    printf("w funkcji %s %d\n", argg[0], strlen(argg[0]));
    printf("w funkcji %s %d\n", argg[1], strlen(argg[1]));
    printf("w funkcji %s %d\n", argg[2], strlen(argg[2]));
    printf("w funkcji %s %d\n\n", argg[3], strlen(argg[3]));

    tab = (char**)malloc(sizeof(char*)*4);

    tab[0] = (char*)malloc(sizeof(char**)*strlen((argg[0])+1));
    tab[1] = (char*)malloc(sizeof(char**)*strlen((argg[1])+1));
    tab[2] = (char*)malloc(sizeof(char**)*strlen((argg[2])+1));
    tab[3] = (char*)malloc(sizeof(char**)*strlen((argg[3])+1));

    strcpy(tab[0], argg[0]);
    strcpy(tab[1], argg[1]);
    strcpy(tab[2], argg[2]);
    strcpy(tab[3], argg[3]);

    printf("po przepisaniu %s %d\n", tab[0], strlen(tab[0]));
    printf("po przepisaniu %s %d\n", tab[1], strlen(tab[1]));
    printf("po przepisaniu %s %d\n", tab[2], strlen(tab[2]));
    printf("po przepisaniu %s %d\n\n", tab[3], strlen(tab[3]));

    return tab;
}

int main()
{
    char **tab, *argg[] = {"cos1", "cos2", "cos3", "cos4"};

    printf("%s %d\n", argg[0], strlen(argg[0]));
    printf("%s %d\n", argg[1], strlen(argg[1]));
    printf("%s %d\n", argg[2], strlen(argg[2]));
    printf("%s %d\n\n", argg[3], strlen(argg[3]));

    tab = funkcja(argg);

    printf("koniec %s %d\n", tab[0], strlen(tab[0]));
    printf("koniec %s %d\n", tab[1], strlen(tab[1]));
    printf("koniec %s %d\n", tab[2], strlen(tab[2]));
    printf("koniec %s %d\n\n", tab[3], strlen(tab[3]));

    printf("\n\nHello world!\n");

    return 0;
}
0

Ciągle niedobrze: http://ideone.com/XLIRke
Przeczytaj jeszcze pierwsze linijki mojego posta.

0

No tak moje niedopatrzenie :(
muszę przysiedzieć nad wskaźnikami :(
Jeszcze raz dziękuję...

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