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
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.
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.