[C++] Modyfikowanie stałego tekstu przypisanego do zmiennej char*
Ostatnio zmodyfikowano 2015-01-23 13:10
nowic Temat założony przez niniejszego użytkownika |
[C++] Modyfikowanie stałego tekstu przypisanego do zmiennej char* » 2015-01-15 15:57:38 Cytuję z kursu C++ (http://edu.pjwstk.edu.pl/wyklady/pro/scb/PRG2CPP_files/node116.html):
"Aby napis był modyfikowalny, należy go zadeklarować jawnie jako tablicę: 1. char* s1 = "Ula"; // Niemodyfikowalny, wymiar 4 2. char s2[] = "Ula"; // Modyfikowalny, wymiar 4 3. char s3[] = {'U', 'l', 'a', '\0'} // Jak s2 W dwóch ostatnich przypadkach jest to zwykła tablica, utworzona na stosie. Natomiast tablica utworzona w sposób przedstawiony w linii 1 jest alokowana gdzie indziej i jest niemodyfikowalna. Należy o tym pamiętać przy przekazywaniu tego rodzaju napisów do funkcji. Typem s1 jest char*, a więc kompilator zgodzi się na wysłanie s1 do funkcji, których odpowiedni parametr nie był wcale zadeklarowany jako const char*. Tym niemniej, próba modyfikacji takiego napisu przez funkcję skończy się załamaniem programu."
I moje pytanie. Dlaczego nie mogę modyfikować s1 np. tak: s[0]='A'; czyli s1 staje się "Ala". Czy zrobię taką modyfikację w main czy w funkcji np. f(char* s1) żadne załamanie programu czy ostrzeżenie nie następuje! Nie widzę żadnego powodu, żeby tak niewinna modyfikacja mogła cokolwiek załamać w programie. Może ktoś potrafi to wyjaśnić.
|
|
pekfos |
» 2015-01-15 17:19:44 Modyfikowanie stałych ma niezdefiniowane zachowanie. Kompilatory nie muszą wykrywać wszystkich błędów tego typu, co bynajmniej nie znaczy, że można tak robić. Tu powinno być ostrzeżenie. Nie widzę żadnego powodu, żeby tak niewinna modyfikacja mogła cokolwiek załamać w programie. Może ktoś potrafi to wyjaśnić. |
Prosty przykład, może niezbyt poprawny, ale prosty: const int X = 5;
void v( int ); void r( const int & );
X = 3;
v( X ); r( X ); Stała to zmienna, która się nie zmienia, więc ma przydzieloną pamięć i wartość. Kompilator może zoptymalizować użycie wartości stałej, wstawiając jej wartość do generowanego kodu, zamiast odwoływania się co i rusz do pamięci. Odwołania przez adres nie można tak zoptymalizować, więc jeśli zmieniłbyś wartość stałej, może dojść do sytuacji, że do v() będzie przekazane 5, a r() dostanie 3. Wystarczające 'załamanie'? |
|
GolemXIV |
» 2015-01-15 18:27:00 Dodatkowo: kompilator ma prawo wszystkie wystąpienia napisu "Ula" zgrupować i zapakować w jedno miejsce. Zmiana "Ula" na "Ola" skutkowałaby zmianą _wszędzie_.
Poza tym, jeśli program by był zapakowany w urządzenie, i napis "Ula" by trafił do pamięci stałej (ROM), to mógłby się system operacyjny oburzyć na takie traktowanie.
|
|
Monika90 |
» 2015-01-16 09:09:48 Tu powinno być ostrzeżenie. |
Może być nawet error, bo kod jest błędny, choć przed C++11 był dopuszczalny. |
|
Leon90 |
» 2015-01-23 13:10:08 char* s1 = "Ula"; W tym przypadku zostanie stworzony "Ula", który zostanie umieszczony w pamięci Read-only oraz wskaźnik s który na niego wskazuje. |
|
« 1 » |