Tworzenie kopii dynamicznej tablicy char.

0

Cześć, mam pytanie, żeby rozwiać swoje wątpliwości. Mając taki kawałek kodu wszystko działa poprawnie:

int main()
{
int tab[] = { 1,2,3,4 };
    int* tab2 = new int[4];
    for (int i = 0; i < 4; i++)
        tab2[i] = tab[i];
    for(int j = 0; j < 4; j++)
        cout << tab2[j];
    delete[] tab2;
}

Natomiast taki przypadek wyrzuca wyciek pamięci:

int main()
{
    char tab[] = "Krab";
    cout << strlen(tab);
    char* tab2 = new char[strlen(tab)];
    strcpy(tab2, tab);
    cout << tab2;
}

Jak zmienię trzecią linijkę na:

char* tab2 = new char[strlen(tab)+1];

to wszystko działa poprawnie. I tu właśnie chciałem się dopytać, czy wynika to z faktu, że ostatnim elementem takiej tablicy znaków jest znak '\0', który świadczy o zakończeniu napisu i też trzeba zarezerwować miejsce w pamięci na ten znak?

4

Tak, ale ogółem powinieneś używać std::string/std::string_view dla stringów i std::vector/std::array dla innych typów.

https://dsp.krzaq.cc/post/176[...]xx-kiedy-uzywac-new-i-delete/

0

Jest dokładnie tak jak mówisz.
strlen działa tak, że szuka \0.
http://www.stdlib.net/~colmmacc/strlen.c.html
Jak nie podasz jej w stringu to będzie najpewniej zwracało coś złego.
BTW: zależne jest też od implementacji, aczkolwiek jak sam planujesz robić string za pomocą tablicy char, to wstawiaj ten \0 na końcu, żeby niezależnie od implementacji strlen zwracało dobrą dłguość.

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