Zmiana cstringu wewnątrz funkcji - przydzielanie pamieci

0

Witam, mam problem z malutkim programikiem, mianowicie:

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

void costam(char * in, char * co)
{
    char * temp = NULL;
    size_t len = strlen(co);
    temp = (char*)malloc(len);
    memset(temp, 0, len);
    strcpy(temp, co);
    free(in);
    in = temp;
    printf("a wewnatrz funkcji: %s\n", in);
}

int main()
{
    char *x = (char*)malloc(sizeof(char) * 20);
    strcpy(x, "blablablablablablab");
    printf("%s\n",x);
    costam( x, "nowenowenowenowenowenowenowe");
    printf("%s",x);
    free(x);
    return 0;
}

Na ekranie pokazuje się:

blablablablablablab
a wewnatrz funkcji: nowenowenowenowenowenowenowe
└►e

Jak widac w mainie przydzielilem pamiec i wpisalem do niej cstring "blablablablablablab". Nastepuje wypisanie, a potem w funkcji cos tam, wpisuje do niej cstring "nowenowenowenowenowenowenowe". Wewnątrz tej funkcji przydzielam pamięć większa i zwalniam stara. Wskaznik nakierowuję na nowa pamiec. Dlaczego to nie dziala? Przeciez do funkcji przekazuję jej adres, więc powinienem mieć możliwosc zmiany wewnatrz funkcji(de facto mam, tylko ze wychodza krzaki). Gdy uzywam funkcji realloc wszystko dziala. Proszę o wyjasnienie mi tego zagadnienia.

0
    size_t len = strlen(co);
    temp = (char*)malloc(len);

Alokować musisz o jeden bajt więcej, bo brakuje miejsca na znak końca \0.

0

Poza tym:

void costam(char * in, char * co)
{
    ...
    temp = (char*)malloc(len);
    ...
    in = temp; //<--- przypisujesz wskaźnik lokalnej zmiennej
    ...
}

Po wywołaniu tej funkcji wskaźnik x z maina dalej będzie wskazywał na starą (i co gorsza zwolnioną) pamięć.

Niech funkcja zwraca wskaźnik na nową pamięć.

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