badboy11 Opublikowano 22 Września 2004 Zgłoś Opublikowano 22 Września 2004 void odwroc (char * lan) { int i; char c; for (i=0; i < (strlen(lan)/2); i++ ) { c = lan; lan = lan[strlen(lan)-1-i]; lan[strlen(lan)-1-i] = c; } return; } to moja skromna funkcja do odwracania kolejnosci literek w stringu, pytanie: dlaczego nie chce ona odwrocic stringa zainicjalizowanego tak: char * zdanie = "kobyla ma maly bok" -wyskakuje wtedy segmentation fault... ale z 'char zdanie[ ] = "costam..." ' radzi sobie jak najlepiej...[/b] Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
spicum Opublikowano 22 Września 2004 Zgłoś Opublikowano 22 Września 2004 Taki zapisik [php:1:128ede7b6e]char * zdanie = "costam";[/php:1:128ede7b6e] powoduje pewnie ze zdanie jest stringiem traktowanym jako stala jak zrobisz inicjalizacje pamieci jak ponizej to juz gra [php:1:128ede7b6e] char * zdanie; zdanie = (char*) malloc(sizeof(char)*6); strcpy(zdanie, "costam"); [/php:1:128ede7b6e] :) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
badboy11 Opublikowano 23 Września 2004 Zgłoś Opublikowano 23 Września 2004 hmmm a to dziwne bo czytalem przed chwila ze jedyna roznica miedzy tymi dwoma zapisami to to, ze nazwy tablicy (wskaznika na 1 elem) nie mozna np inkrementowac a jak jest " char * zdanie" to wskaznik zdanie moge zmieniac... poza tym gdyby ten string bylk stala to przy probie zmiany wyskoczyl by chyba blad kompilacji?? a tutaj wyskakuje Segmentation Fault ... Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
yasin Opublikowano 23 Września 2004 Zgłoś Opublikowano 23 Września 2004 jak masz char* p_cBla = "aaaaa", to nie mozesz sobie zrobic p_cBla[1]='b' - to da niespodziewane skutki, zalezy od systemu i kompilatora, to blad Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Megabyte Opublikowano 23 Września 2004 Zgłoś Opublikowano 23 Września 2004 [php:1:4d5eb55cb1] char *zmienna = "tekst"; [/php:1:4d5eb55cb1] powoduje zadeklarowanie wskaźnika i ustawienie go na stringa w kodzie programu. [php:1:4d5eb55cb1] char zmienna[] = "tekst"; [/php:1:4d5eb55cb1] powoduje utworzenie tablicy znakowej i skopiowanie do niej stringa. Jak widać różnica jest bardzo duża a "zmienna" odwołuje się do innych obszarów w pamięci. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
marcinEc Opublikowano 25 Września 2004 Zgłoś Opublikowano 25 Września 2004 hmmm a to dziwne bo czytalem przed chwila ze jedyna roznica miedzy tymi dwoma zapisami to to, ze nazwy tablicy (wskaznika na 1 elem) nie mozna np inkrementowac a jak jest " char * zdanie" to wskaznik zdanie moge zmieniac...Coś się Wam pomyliło ze stałymi wskaźnikami i wskaźnikami stałych... Jest tak jak napisał Megabyte: char * daje łańcuch + dodatkową zmienną-wskaźnik, a char[] daje tylko tablicę. Ale twierdzenie, że Jak widać różnica jest bardzo duża a "zmienna" odwołuje się do innych obszarów w pamięci. to bzdura, inaczej nie byłoby równoważności między tablicą a wskaźnikiem. Nie ma żadnej różnicy w działaniu char* i char[]!! Spróbujcie wykonać: [php:1:85905df49c] char *aaa = "adgffgdfg"; char bbb[] = "fghfghf"; puts( aaa ); puts( bbb ); [/php:1:85905df49c] Wszystko działa ok.żadnych błędów podczas uruchomienia. poza tym gdyby ten string bylk stala to przy probie zmiany wyskoczyl by chyba blad kompilacji?? a tutaj wyskakuje Segmentation Fault ...Masz rację :) ale nie do końca... Po prostu kompilator umieszcza łańcuch przypisany do wskaźnika (char *s="..") w miejscu, z którego można tylko czytać i dlatego wyskakuje SF (dokładnie błąd jest w miejscu: lan = ...). Tak naprawdę jest to definicja stałego łańcucha - nie można do niego zapisywać. A ponieważ w funkcji odwroc() parametrem jest char* także kompilator nie pokaże żadnego błędu ani ostrzeżenia. Tak naprawdę wyrażenie char *s = "..." można zapisać jako: const char s[] = "..."; // to jest const char *w = s; // a to nie jest const Należy pamiętać, że jeśli łańcuch ma być zmieniany musi zostać zadeklarowany przez char[]. W kompilatorze GCC istnieje specjalna opcja -Wwrite-strings dająca ostrzeżenie przy deklaracji typu char *s = "..."; dokładnie: "warning: initialization discards qualifiers from pointer target type" czyli inicjalizacja zdejmuje atrybut [u nas:const] ze wskaźnika. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Polar Opublikowano 25 Września 2004 Zgłoś Opublikowano 25 Września 2004 Nie ma żadnej różnicy w działaniu char* i char[]!! Różnica jest subtelna, taka że { char * wskaźnik = "coś tam" } zostaje zapisane w pamięci w sposób ciągły jedno za drugim. A { char tablica [] = "coś tam" } jako stos. A wiadomo że nazwa tablicy jest jednocześnie adresem jej zerowego elementu czyli zapisy te oznaczją to samo , różnica jest tylko w sposobie zapisu ( ułożenia ) elementów w pamięci. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...