une erreur de segmentation dans du code C

lecyberax

Nouveau membre
salut je programmes sous linux avec l'outil cc..
je vous soumet ce bout code, qui me retourne une Erreur de Segmentation, je ne comprends pas du tout le problème qui se pose avec mes declaratio,.
Ce bout de code me sert dans l'ensemble de mon programme et voilà qu'il ne marche pas ..
------A I D E !!----------

[cpp]
#include <stdio.h>

/*declaration de le structure de snombre manipulé */
struct nombre{
int typeNombre; /*le type du nombre [entier|reel]*/
double valeur; /*le valeur du nombre */
}nombre;

int main(){

struct nombre *ptrNombre;
ptrNombre->typeNombre=12;
printf("%d\n",ptrNombre->typeNombre);
return 0;

}[/cpp]

-------M E R C I -----------------
 

zeb

Modérateur
[strike]--------- PRIERE D'UTILISER LA BALISE CODE ---------

Pour ce faire, clique sur le bouton , et ajoute la balise CODE (entre crochets) au début de ton code, et la balise /CODE (entre crochets) à la fin.

Pourquoi ? Parce que :[/strike]
Vous devez être connecté pour voir les images.

--------- RELIS TON MANUEL DE C ---------

(Le chapitre sur les pointeurs)

Un pointeur pointe (si, si) sur une "case" en mémoire.
Soit cette "case" existe déjà, et on fait pointer la variable pointeur dessus.

Soit cette "case" n'existe pas encore, et il faut alors la créer. Si cette "case" n'est pas une variable mais juste un bout de mémoire uniquement référencé par le pointeur, on parle d'allocation.

Je verrais bien un truc comme ça avant la ligne n° 12 [strike]???? (Ben oui gros malin, si tu avais mis ton code entre les balises CODE, on verrait un n° de ligne)[/strike] :

Code:
   ptrNombre = malloc ( sizeof ( struct nombre ) );
   ....
   free ( ptrNombre );
 

Emmanuel Delahaye

Expert

Le déréférencement d'un pointeur non initialisé invoque un comportement indéfini. Tout peut arriver.

Avant d'utiliser un pointeur, il faut lui donner une valeur valide.


 

lecyberax

Nouveau membre
En ce qui concerne les poointeur;
ca veux dire koi dereferencement? cet terme me donne des soucis
 

Emmanuel Delahaye

Expert

Déréférencer signifie "Accéder à la valeur pointée". Utiliser l'opérateur * ou ->.

C'est dans ton cours de C...
 

lecyberax

Nouveau membre


après avoir declarer ma structure
[cpp]
struct nombre {
int typenombre;
double valeur;
}nombre;
[/cpp]

Après ma declaration de pointeur sur ma structure :
[cpp]
struct nombre *ptrNombre;
[/cpp]

Pour pouvoir faire un initialisation j'aurai du créer une valeur en mémoire?
comme ceci?:
[cpp]ptrNombre = malloc ( sizeof ( struct nombre ) );[/cpp]

Pour pouvoir enfin faire des initialisations..
Est-ce cela que j'aurai du faire pour éviter des Erreur de segmentation?
Mais ce qui me parait bizzard c'est qu'avec Borland C++, ca marche sans problème ; alors que sous linux (l'outils gcc/cc) cela génère des erreurs..
 

KangOl

Grand Maître
oui c'est ca

et ca m'etonnerai que ca fonctionne avec borland (enfin, avec borland tout peut arriver)
 

Emmanuel Delahaye

Expert

C'est ce que tu aurais dû faire pour écrire du code correct, c'est à dire qui n'invoque pas un comportement indéfini.

Mais est-tu sûr d'avoir besoin d'un pointeur ?
[cpp]
struct nombre
{
int typenombre;
double valeur;
};

struct nombre Nombre;
[/cpp]
est aussi valable, et si tu dois passer une l'adresse à une fonction, il suffit de faire
[cpp] f(&Nombre);[/cpp]

Sinon, si on reprend ta définition originale, tu avais combiné définition de la structure et instanciation de celle-ci :
[cpp]
struct nombre
{
int typenombre;
double valeur;
}
nombre;

f(&nombre);
[/cpp]
Ou, si tu tenais vraiment au pointeur :
[cpp]
struct nombre
{
int typenombre;
double valeur;
}
nombre;

struct nombre *ptrNombre = &nombre;

f(ptrNombre);
[/cpp]
Tout dépend de ce que tu veux faire exactement. Mais une chose est sûre, un pointeur doit être initialisé correctement avant d'être déréférencé.
 

clanki

Nouveau membre
bon écoutez quelqu'un peut t'il me donner un lien de site internet de la programmation de dev c++ pk la je ne comprend rien a ce que vous dites je suis débutant.
 

clanki

Nouveau membre
bonjour je suis nouveau sur le forum je voullais savoir a koi sérvait un pointeur merci d'avance.
 

Emmanuel Delahaye

Expert

STOP !

On ne va pas répondre aux questions basiques qui se trouvent dans n'importe quel tutoriel. Alors tu vas sur le site du zero comme on te l'a déjà conseillé,



et tu suis le tutoriel C, tu réponds aux QCM, tu fais les exos. Là-bas, tu auras toute l'aide nécessaire. C'est fait pour.
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 134
Messages
6 718 078
Membres
1 586 394
Dernier membre
Manoushk
Partager cette page
Haut