[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 » |