Tworzenie kopii dynamicznej tablicy char.

Tworzenie kopii dynamicznej tablicy char.
NU
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:8
0

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

Kopiuj
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:

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

Jak zmienię trzecią linijkę na:

Kopiuj
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?

AK
tak, dobrze rzoumiesz
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:dzień
  • Lokalizacja:Szczecin
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/ucze-sie-cxx-kiedy-uzywac-new-i-delete/


pylaochos
  • Rejestracja:ponad 13 lat
  • Ostatnio:2 miesiące
  • Lokalizacja:Warszawa
  • Postów:85
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ść.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.