Naruszenie ochrony pamięci - operacje na stringach [podstawy]

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
Cooler1989
Sędziwy Jeż
Sędziwy Jeż
Posty: 35
Rejestracja: 14 maja 2007, 15:02
Płeć: Mężczyzna
Wersja Ubuntu: 8.04
Środowisko graficzne: GNOME
Kontakt:

Naruszenie ochrony pamięci - operacje na stringach [podstawy]

Post autor: Cooler1989 »

Kod: Zaznacz cały

        char text;
	text="Wokunm";  //Nie wiem czy znak
	*(text)='T';

przy tak prostym dzialaniu wyskakuje mi "Naruszenie ochrony pamieci", Dlaczego? Prosze o pomoc - czytam o obsludze stringow i tam nic nie tlumaczy zachowania tej natury...
Awatar użytkownika
Hauleth
Wytworny Kaczor
Wytworny Kaczor
Posty: 382
Rejestracja: 18 sie 2008, 17:43
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: GNOME
Architektura: x86

Odp: Naruszenie ochrony pamięci - operacje na stringach [podstawy]

Post autor: Hauleth »

Bo przypisujesz tablicę znaków do pojedynczego znaku, który jeszcze próbujesz zdereferować. To się nie powinno skompilować. Zrób tak:

Kod: Zaznacz cały

char text[100];
strcpy(text, "Wokumn");
*text = 'T';
Jeśli problem rozwiązany dodaj na początku tematu [SOLVED].

Biblioteka do C++ - Bust Lib: http://code.google.com/p/bust/
Awatar użytkownika
Cooler1989
Sędziwy Jeż
Sędziwy Jeż
Posty: 35
Rejestracja: 14 maja 2007, 15:02
Płeć: Mężczyzna
Wersja Ubuntu: 8.04
Środowisko graficzne: GNOME
Kontakt:

Odp: Naruszenie ochrony pamięci - operacje na stringach [podstawy]

Post autor: Cooler1989 »

Dzięki - teraz już działa to co planowałem. Dalej jednak nie rozumiem, dlaczego nie działało moje rozwiązanie: Myślałem, że przypisanie *zmienna="text", zadziała w ten sposób, że przypisze ciąg znaków 'text' w pamięci rozpoczynając od miejsca na które wskazuje wskaźnik - co więcej, ja za pomocą malloc zapewniłem wystarczająco miejsca.
Zdziwiłem się też kiedy później odkryłem, że jak robiłem takie przypisanie to ten wskaźnik zmienił miejsce...
Co więcej, jeżeli wyświetlałem tą zmienną 'puts(zmienna)' to mi wyświetlał całość, no więc myślałem że nawet pomimo tego, że tą zmienna sobie gdzieś przeniusł to przechowuje ją jako ciąg znaków i za pomocą wskaźników do kolejnych komórek będę mógł ją edytować.

No nic - marny ze mnie programista, ale wielkie dzięki za pomoc :)
Awatar użytkownika
beluosus
Zakręcona Traszka
Zakręcona Traszka
Posty: 695
Rejestracja: 01 paź 2006, 15:32
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86
Kontakt:

Odp: Naruszenie ochrony pamięci - operacje na stringach [podstawy]

Post autor: beluosus »

Cooler1989 pisze:Myślałem, że przypisanie *zmienna="text", zadziała w ten sposób, że przypisze ciąg znaków 'text' w pamięci rozpoczynając od miejsca na które wskazuje wskaźnik
Takie przypisanie to w ogóle nieporozumienie (bo *zmienna jest typu char). "napis w cudzysłowach" to także wskaźnik, na typ const char.
Cooler1989 pisze:Zdziwiłem się też kiedy później odkryłem, że jak robiłem takie przypisanie to ten wskaźnik zmienił miejsce...
Patrz wyżej. Nie jest bezpieczne przypisywanie adresu stałej do wskaźnika zmiennej, bo wtedy kompilator pozwoli na zmianę stałej (która jest w pamięci tylko do odczytu -> error).

Btw odnośnie tematu, mówisz o cstringach. Stringi występują w C++ (std::string) i tam takie przypisania (zmienna = "tekst") są możliwe, bo operatory są przeciążone i wykonują brudną robotę (strcpy, alloc) za Ciebie.
Kurs Linuksa: for i in $(ls /bin); do man $i; done
__________________
http://beluosus.pl/
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 2 gości