Newsgroup: it.comp.os.linux.development
Titolo: segment. fault in GCC per puntatore char ??

Salve a tutti,
mi è capitata una cosa strana e vorrei domandarvi se vi è successo e che ne
pensate.
In GCC su SUSE 6.0, ho scritto
...
char *nome="nome00";
...........................
...........................
nome[4]++;
...
Servirebbe a generare i nomi di file per un insieme di file da creare
run-time. Dovrebbe produrre i file nome00, nome01, nome02, ... Il problema è
che va tutto bene, ma l'istruzione nome[4]++ va irrimediabilmente e sempre
in segmentation fault.
Grazie
Stefano

Pape' Satan, pape' Satan aleppe, comincio' Stefano con voce chioccia:
S> char *nome="nome00";
S> nome[4]++;
S> Servirebbe a generare i nomi di file per un insieme di file da creare
S> run-time. Dovrebbe produrre i file nome00, nome01, nome02, ... Il problema è
S> che va tutto bene, ma l'istruzione nome[4]++ va irrimediabilmente e sempre
S> in segmentation fault.
e' giusto che sia cosi', le stringhe definite in quel modo sono
costanti e non possono essere modificate. Non e' un problema di
linux, questo e' cio' che prevede lo standard C.
-- 
addio, e grazie per tutto il pesce

 in segmentation fault.
Per iniziare dovrebbe essere nome[5], non 4.
Il problema, come ti ha detto Dr. Foobar, e` che quella stringa e` una
costante, e il compilatore, dopo averla schiaffata in una zona di
memoria read-only, cerca di riscriverci. Se non vuoi proprio cambiare il
codice, compila con -fwritable-strings.
Ciao
 David
-- 
<d.santinoli presso mi . flashnet . it>


allora dovrebbe avere un errore dal compilatore e non un sigsegv dal sistema
non ti pare?

 
-- 
Consultando un numero sufficiente di esperti 
si puo' confermare qualsiasi opinione
Legge di Hiram

non ti pare?
Se attiva tutti i warnings del compilatore, infatti, il compilatore
bercia.
Prima, esige che nome sia dichiarato const, poi si incupisce quando
vede quel ++.
Leonardo
-- 
".signature": bad command or file name

 non ti pare?
no, il compilatore controlla che l'operazione sul puntatore sia valida,
e in questo caso lo e`
il problema sorge a runtime quando il programma cerca di scrivere in
un'area di memoria read-only
se la stringa fosse stata preparata con malloc e strcpy l'istruzione
sarebbe stata corretta
ciao
Kronos
-- 
Home: 
http://kronoz.tsx.org
La somma dell'intelligenza sulla terra e' una costante.
La popolazione e' in aumento.

> linux, questo e' cio' che prevede lo standard C.
M> allora dovrebbe avere un errore dal compilatore e non un sigsegv dal sistema
M> non ti pare?
il compilatore non e' tenuto a generare nessun errore, perche' il
problema viene fuori a run-time, quando tenti di scrivere in una zona
di memoria read-only. Dal suo punto di vista e' tutto corretto. Se tu
invece avessi scritto "const char *blablabla" il compilatore ti
avrebbe giustamente avvisato:
warning: increment of read-only location


, "Dr. Foobar"
<pic...@ti.orebil.invalid> ha scritto:

oppure prova cosi:
#include <stdio.h>
static char x[]="prova";
int main() {
	x[4]++;
	printf("%s\n",x);
	return 0;
}
ciao eno


nno..nno.. non mi pare.  nome++ allora sarebbe incrementare un indirizzo di
memoria. Se metto [x] dopo un indirizzo il C automaticamente lo considera
come * (indirizzo + x). Credo invece che abbiano ragione gli altri; era un
area di memoria read-only. Dichiarando char nome[5]; e poi subito dopo
(anche se poco elegante) strcpy(nome,"nome00") va tutto bene. Proverò poi
anche le altre proposte.
-> -> -> ->   -----intanto vi ringrazio tutti----     ;)
Stefano

 cosa che non si puo' fare.
	sbagli - non incrementi un indirizzo di memoria !!
      prova il programmino da me dato a risposta 
-- 
#eno