PDA

Visualizza la versione completa : [C++] CiaoMondo.cpp... Segmentation Fault ???


Sergio Pedone
09-02-2004, 20:37
Buon giorno a tutti.
Mi sto accingendo a studiare un po' di C++ perchè
voglio saper leggere un listato in tale linguaggio.
A dir la verità non solo questo.
Ho tra le mani un testo che era allegato ad una rivista
di programmazione: il testo fa riferimento, forse, a versioni
non recenti del compilatore e/o standard C++.
Il mio ambiente è Linux Slackware 9.1 e gcc 3.2.3
Sta di fatto che devo utilizzare iostream in luogo di
iostream.h, specificare obbligatoriamente un namespace, ecc.

A fronte del seguente codice:


#include <iostream>

using namespace std;

int main()
{
char* nome;
cout << "Come ti chiami?\n";
cin >> nome;
cout << "Ciao, " << nome << "." << endl;
return 0;
}

ho un paio di domande da fare.
1) Perchè l'esecuzione termina con un "Segmentation Fault"?
Cosa causa quest'errore a run-time? (overflow?)
2) Potete chiarirmi la differenza tra gcc e g++ per compilare?

Sicuramente avro detto qualche fesseria, scusatemi.

Grazie per le eventuali risposte. :ciauz:

iguana13
09-02-2004, 20:47
L'errore te lo da perchè tu hai dichiarato solo un puntatore, ma non hai allocato la memoria sufficente per contenere il nome.

Prova con:


char nome[50];

per avere massimo 49 caratteri.

Buona fortuna! ;)

Sergio Pedone
09-02-2004, 20:54
Innanzitutto, grazie per la risposta.
Conosco come si dichiarano i puntatori, i reference, la dereferenziazione, ma quella dichiarazione della variabile l'ho presa paro paro dal testo.
Scusa, ma char* non equivale a dichiarare un variabile stringa, ovvero un'array di caratteri?
Quindi la mia variabile punta alla prima area di memoria occupata dall'array?
Con char nome[50], posso utilizzare 49 caratteri più un terminatore di stringa, vero?

Grazie per l'aiuto, :ciauz:

LeleFT
09-02-2004, 21:01
A me non va in Segmentation Fault. Comunque per rispondere alla tua seconda domanda, la differenza dovrebbe essere questa (sono pronto a ricevere qualsiasi rettifica):

il gcc (Gnu C Compiler) è, come dice il nome stesso, un compilatore per codice C, mentre il G++ è il compilatore per codice C++.


Ciao.

iguana13
09-02-2004, 21:06
Prima rettifica (anche se non mi intendo di linux):
gcc = Gnu Compilers Collection (credo) e non compila solo C.

:ciauz:

LeleFT
09-02-2004, 21:11
Effettivamente sono rimasto un po' indietro con le definizioni e con i supporti.
Tratto dal sito ufficiale del GCC:

«GCC used to stand for the GNU C Compiler, but since the compiler supports several other languages aside from C, it now stands for the GNU Compiler Collection.»

Grazie per la correzione!


Ciao. :ciauz:

Johnny_Depp
09-02-2004, 21:32
ritornando ai puntatori...

in C++

#include <iostream>

using namespace std;

int main()
{
char* nome;
nome = new char [20]; // alloco in memoria lo spazio per un puntatore a caratteri di venti elementi.
cout << "Come ti chiami?\n";
cin >> nome;
cout << "Ciao, " << nome << endl;
delete [] nome; // libero la meoria
system("pause");
return 0;
}

in C


#include <stdio.h>
#include <malloc.h>

int main()
{
char* nome;
nome = (char*) malloc(20*sizeof(char)); /* alloco in memoria lo spazio per un puntatore a caratteri di venti elementi. */
printf("Come ti chiami?\n");
scanf("%s", nome);
printf("Ciao, %s\n", nome);
free(nome); /* libero la memoria */
return 0;
}
Come vedi il problema del "segmentation fault" non è legato al linguaggio... (C++ piuttosto che C)
N.B. con alcuni compilatori il codice postato da Sergio Pedone
potrebbe anche passare, non mandando il programma in fault,
ma è solo per puro caso, provate ad esempio a dichiarare 5 puntatori
e a non allocare la memoria necessaria...
Provate ad esempio questo codice:

#include <stdio.h>
#include <malloc.h>

int main()
{
char *nome1, *nome2, *nome3, *nome4, *nome5;
//nome = (char*) malloc(20*sizeof(char)); // non alloco nulla
printf("Come ti chiami?\n");
scanf("%s", nome1);
printf("Come ti chiami?\n");
scanf("%s", nome2);
printf("Come ti chiami?\n");
scanf("%s", nome3);
printf("Come ti chiami?\n");
scanf("%s", nome4);
printf("Come ti chiami?\n");
scanf("%s", nome5);
printf("Ciao, %s %s %s %s %s\n", nome1, nome2, nome3, nome4, nome5);
//free(nome);
return 0;
}

Sergio Pedone
09-02-2004, 22:33
Ehila! Quanta roba per un CiaoMondo!

Grazie tante a tutti quanti.
In effetti dichiaravo una variabile senza definirne la
dimensione. Cosa che malloc (C) e l'operatore new (C++)
fanno automaticamente.

@Johnny_Depp:
system("pause");
è valida solo su piattaforma windows, vero?

Johnny_Depp
09-02-2004, 23:10
la funzione system() appartiene allo standard ANSI per il C (basta includere <stdlib.h>) quindi la puoi usare benissimo anche con Linux.

Il comando MS-DOS: "PAUSE" invece lo puoi usare soltanto con Windows.
(ergo, non puoi passarlo a system() sotto Linux)

Sergio Pedone
09-02-2004, 23:44
Claro!

:)

Loading