|
|||||||
|
|
|
![]() |
|
|
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;
}
o no?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 13: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: 05:00.










o no?









