C++ sposób to zrobić, jak już zauważył powyżej, byłoby wykorzystanie std::string
zamiast char[]
. To da ci oczekiwane zachowanie przydziału.
Powiedział, że powodem dostajesz tylko błąd za drugim przypadku jest to, że =
w tych dwóch liniach oznaczać różne rzeczy:
char a[10] = "Hi";
a = "Hi";
Pierwszy to inicjalizacja, drugi jest przypisanie .
Pierwsza linia przydziela wystarczającą ilość miejsca na stosie, aby pomieścić 10 znaków, i inicjalizuje pierwsze trzy z tych znaków, aby były "H", "i" i "\ 0". Od tego momentu wszystkie wartości a
odnoszą się do położenia macierzy na stosie. Ponieważ tablica jest tylko miejscem na stosie, a
nigdy nie może się zmienić. Jeśli chcesz, aby inna lokalizacja na stosie zawierała inną wartość, potrzebujesz innej zmiennej.
Druga linia (nieważna) próbuje zmienić a
, aby odnieść się do (odmiennej technicznie) inkantacji "Hi"
. To nie jest dozwolone z powodów wymienionych powyżej. Gdy masz już zainicjowaną tablicę, jedyną rzeczą, którą możesz z nią zrobić, jest odczytanie z niej wartości i zapisanie do niej wartości. Nie możesz zmienić jego lokalizacji ani rozmiaru. Właśnie to zadanie spróbuje wykonać w tym przypadku.
Dla odpowiedzi: Ponieważ jest to oznaczone C++, jest tam * nie * -strcpy "więcej C++" sposób to zrobić mając do czynienia z 'char []'? –
"Bardziej w stylu C++" byłoby użycie ciągu lub wektora zamiast char []. Używając char [], zasadniczo akceptujesz wszystkie C-ności, które się z tym wiążą. –
Cogwheel
dzięki za kolesie. –