Skocz do zawartości
badboy11

char* tab Vs char tab[] -C

Rekomendowane odpowiedzi

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]

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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]

 

:)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...