|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Apr 2006
Città: V.E. (na)
Messaggi: 115
|
[C]puntatori a carattere e array di caratteri
Non riesco a capire perche il programma 1 funziona, mentre il programma 2 va in "Segmentation fault"
Programma 1 Codice:
#include <stdio.h> #include <string.h> /*reverse() inverte una stringa*/ void reverse(char *s); main() { char s[] = "stringa di prova"; printf("%s\n",s); printf("%s\n",(reverse(s),s)); } void reverse(char *s) { char *p ; char c ; for(p = s + strlen(s)-1; s < p; s++,p--) c = *s, *s = *p, *p = c; } Codice:
#include <stdio.h> #include <string.h> /*reverse() inverte una stringa*/ void reverse(char *s); main() { char *s = "stringa di prova"; printf("%s\n",s); printf("%s\n",(reverse(s),s)); } void reverse(char *s) { char *p ; char c ; for(p = s + strlen(s)-1; s < p; s++,p--) c = *s, *s = *p, *p = c; } ![]() uso il compilatore gcc 4.1.2 |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
char s[] = " .... "; istanzia un array di char sullo stack inizializzato in modo da contenere i caratteri della stringa literal. char *s = " .... "; istanzia un puntatore sullo stack in modo che punti direttamente ad una stringa literal. Nel primo caso la stringa è sempre alterabile, in quanto "vive" in una zona di memoria alterabile (lo stack). Nel secondo caso stai andando a scrivere sopra una stringa "literal", che in base al sistema operativo/compilatore molto probabilmente è allocata in una sezione di memoria read-only. (e su Linux accade proprio questo). Scrivere sopra una stringa literal non è una cosa da fare. P.S. occhio a una sintassi come: printf("%s\n",(reverse(s),s)); È chiaro cosa fa: prima valuta (esegue) la funzione reverse, poi valuta 's' che è poi il valore passato a printf. La cosa più semplice è fare in modo che una funzione come reverse, ritorni un puntatore alla stringa, in modo da fare più semplicemente: printf("%s\n", reverse(s));
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) Ultima modifica di andbin : 04-08-2007 alle 12:53. |
|
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: Apr 2006
Città: V.E. (na)
Messaggi: 115
|
grazie andbin
scusa ancora una cosa quindi char *p = "prova"; *p = 's'; mi da segmentation fault perche p punta ad un area di memoria read-only mentre char s [] = "prova" p = s; *p = 's'; si puo fare perche p punta un area di memoria modificabile. è l'unico modo per avere un puntatore ad un area di memoria gia inizializzata e modificabile? |
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
In Linux le stringhe costanti vengono per default allocate in una sezione readonly, a meno che tu ad esempio specifichi in fase di compilazione l'opzione -fwritable-strings, per cui le stringhe costanti vengono messe in un segmento di memoria writable e senza "unicizzarle". Ma come dice anche il man di gcc ... scrivere su una stringa costante è una cattiva idea. Tramite una inizializzazione fatta nella definizione della variabile, sì.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:56.