Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Modyfikowanie stałego tekstu przypisanego do zmiennej char*

Ostatnio zmodyfikowano 2015-01-23 13:10
Autor Wiadomość
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ć.


P-124975
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ć.

char* s1   = "Ula";
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:
C/C++
const int X = 5;

void v( int );
void r( const int & );

X = 3; // Powiedzmy, że się da..

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'?
P-124982
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.
P-124985
Monika90
» 2015-01-16 09:09:48
char* s1 = "Ula";
Tu powinno być ostrzeżenie.
Może być nawet error, bo kod jest błędny, choć przed C++11 był dopuszczalny.
P-125020
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.
P-125422
« 1 »
  Strona 1 z 1