Wątek przeniesiony 2018-10-10 21:20 z C/C++ przez kq.

Znak końca tablicy – dlaczego jest dodawany?

0

Witam testowo zrobiłem program do kopiowania dwóch stringów do jednej tablicy.

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

char* connect(char* txt1, char* txt2, int size)
{

    char* txt3;
    int i = 0;
    txt3 = (char*)malloc(size);
    while (*txt1 != '\0') {
        *(txt3 + i) = *txt1;
        txt1++;
        i++;
    }
    while (*txt2 != '\0') {
        *(txt3 + i) = *txt2;
        i++;
        txt2++;
    }

    return txt3;
}

int main()
{
    int i;
    char tab1[] = "123";
    char tab2[] = " ,432";
    char* txt;
    int x = strlen(tab1) + strlen(tab2) + 1;
    txt = connect(tab1, tab2, x);
    for (i = 0; *(txt + i) != '\0'; i++) {
        printf("%c", *(txt + i));
    }
    free(txt);
    return 0;
}

Moje pytanie brzmi: dlaczego na koniec wskaznika txt dodawany jest znak końca linii , mimo iż w funkcji connect kopiowanie przerywam zanim dany tekst dojdzie do znaku '\0'. Wcześniej po drugiej pętli while miałem jeszcze ** (txt3+i)='\0'* jednak ku mojemu zdziwieniu nie zmienia to kompletnie nic. Gdy zwiększam wartość zaalokowanej pamięci dzieje się to samo.

1

Wychodząc poza zakres tablic lub odczytując niezainicjalizowane jej elemementy wprowadzasz do programu UB, czyli może zdarzyć się wszystko. Pewnie kompilując bez optymalizacji nowe alokacje w twoim programie pochodzą z obszaru, wokół którego są zera. Mimo wszystko to UB.

PS: formatuj kod jak człowiek, i staraj się sensownie nazywać zmienne, a nie jakieś txt1, txt2, txt3.

0

Masz szczescie otrzymywać wyczyszczoną pamięć... Tak nie musi być zawsze.A jeśli masz wyczyszczoną, to tam po prostu jest w tym miejscu '\0'
@kq - z tego co widzę alokuje odpowiednia ilość pamięci - do sumy długości stringów dodaje 1.

0

Po co przekazujesz size do funkcji z zewnątrz - przenieś jego wyliczanie do wewnątrz funkcji.
Dodaj txt3[size-1] = '\0' przed returnem.

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