Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1607 connectés 

  FORUM HardWare.fr
  Programmation
  C

  segmentation fault

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

segmentation fault

n°1346532
mbarekh
Posté le 13-04-2006 à 23:23:58  profilanswer
 

Bonjour,
est ce que quelqu'un peut me dire pourquoi ce code génére un seg fault?
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void swap(int *a,int *b)
  4. {
  5.      int* temp;
  6.      *temp = *a;
  7.      *a=*b;
  8.      *b=*temp;
  9. }
  10. int main()
  11. {
  12.     int* a;
  13.     int* b;
  14.     *a=2;
  15.     *b=3;
  16.     printf("a = %d \n",*a);   
  17.     printf("b = %d \n",*b);
  18.     swap(a,b);
  19.     printf("new a = %d \n",*a);
  20.     printf("new b = %d \n",*b);
  21. //    system("PAUSE" );
  22.     return(1);
  23. }


 
 
merci d'avance :)

mood
Publicité
Posté le 13-04-2006 à 23:23:58  profilanswer
 

n°1346534
skelter
Posté le 13-04-2006 à 23:28:26  profilanswer
 

a et b ne sont initialisés avec une adresse valide

n°1346535
mbarekh
Posté le 13-04-2006 à 23:35:26  profilanswer
 

mais pourquoi je devrais les initialiser. est ce que tu peux détailler un peu stp?

n°1346536
skelter
Posté le 13-04-2006 à 23:37:15  profilanswer
 

mais tu sais c'est quoi un pointeur ?

n°1346538
mbarekh
Posté le 13-04-2006 à 23:40:07  profilanswer
 

oui je sais. mais je ne comprends pas ou est la faute dans mon programme. un pointeur est une variable qui stocke une adresse d'une autre variable

n°1346540
skelter
Posté le 13-04-2006 à 23:43:47  profilanswer
 

et tes pointeurs a et b, ils stockent l'adresse de quelle variable ?

n°1346541
skelter
Posté le 13-04-2006 à 23:45:27  profilanswer
 


int a = 2;
int b = 3;
...
swap(&a, &b);

n°1346542
Emmanuel D​elahaye
C is a sharp tool
Posté le 13-04-2006 à 23:46:38  profilanswer
 

skelter a écrit :

et tes pointeurs a et b, ils stockent l'adresse de quelle variable ?


On est encore tombé sur une flèche...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1346543
mbarekh
Posté le 13-04-2006 à 23:46:57  profilanswer
 

mais moi je dis juste que a et b sont des pointeurs vers deux cases memoires qui contiennent une 2 et l'autre 3.C'est pas possible en C?

n°1346545
mbarekh
Posté le 13-04-2006 à 23:50:50  profilanswer
 

skelter a écrit :

int a = 2;
int b = 3;
...
swap(&a, &b);


 
mais meme ca ca ne marche pas, ça génére aussi un seg fault.

mood
Publicité
Posté le 13-04-2006 à 23:50:50  profilanswer
 

n°1346547
zapan666
Tout est relatif
Posté le 13-04-2006 à 23:54:24  profilanswer
 

mbarekh a écrit :

mais meme ca ca ne marche pas, ça génére aussi un seg fault.


Parce que tu as le même problème de pointeur non initialisé dans ta fonction swap

Code :
  1. void swap(int *a,int *b)
  2. {
  3.    int temp;
  4.    temp = *a;
  5.    *a=*b;
  6.    *b=temp;
  7. }


Message édité par zapan666 le 13-04-2006 à 23:54:41

---------------
my flick r - Just Tab it !
n°1346549
Emmanuel D​elahaye
C is a sharp tool
Posté le 13-04-2006 à 23:56:47  profilanswer
 

mbarekh a écrit :

mais moi je dis juste que a et b sont des pointeurs vers deux cases memoires qui contiennent une 2 et l'autre 3.C'est pas possible en C?


Ben non. 2 et 3 sont de expression constantes. elles n'ont pas d'adresse.
 
Tu veux faire

Code :
  1. int *a = &2; ?


 
Reprenons. L'objet du litige est là :  

Code :
  1. int* a;


a est une variable non initialisée. OK ?
 
comme c'est un pointeur, tu le déréférences avec l'opérateur '*' et tu mes une valeur dans la zone pointée.

Code :
  1. *a=2;


C'est syntaxiquement correct, mais il y a un hic. Comme la valeur de a est indéterminée, l'opérateur * cherche à atteindre une zone mémoire dont l'adresse est indéterminée. Tu penses que c'est correct ?
 
Ben non. Ca s'appelle un 'comportement indéterminé' et c'est un sale bug qui peut provoquer n'importe quoi.
 
Donc, quand des intervenants expérimentés de ce forum te disent qu'il y a un problème avec l'initialisation du pointeur, tu peux le croire et arréter de vouloir faire le malin.


Message édité par Emmanuel Delahaye le 13-04-2006 à 23:59:31

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1346550
mbarekh
Posté le 13-04-2006 à 23:57:11  profilanswer
 

oui ça marche mais je ne comprends pas pourquoi on doit toujours initialiser un pointeur alors qu'il est une variable aussi tout comme "int temp".

n°1346552
mbarekh
Posté le 14-04-2006 à 00:00:09  profilanswer
 

merci j'ai tout compris. c'était un cours clair est simple. mais je te jusre que je voulais pas faire le malin, je voulais comprendre une fois pour toute.

n°1346553
Emmanuel D​elahaye
C is a sharp tool
Posté le 14-04-2006 à 00:04:13  profilanswer
 

mbarekh a écrit :

oui ça marche mais je ne comprends pas pourquoi on doit toujours initialiser un pointeur alors qu'il est une variable aussi tout comme "int temp".


Je viens de te l'expliquer. Si tu ne comprends pas l'explication, pose des questions. Et dans le code corrigé, tu crois que temp n'est pas initialisé ? Et ça ?

Code :
  1. temp = *a;


c'est de la déco ?
 
Sinon, ça t'arrive souvent d'utiliser des valeurs indéterminées ?
 
On pourrait faire ça aussi :  
 

Code :
  1. FILE *fp;
  2.    fprintf(fp, "gros crash\n" );


ca fera économiser un fopen() qui ne sert à rien. C'est ça ton raisonnement ?


Message édité par Emmanuel Delahaye le 14-04-2006 à 00:05:10

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1346556
zapan666
Tout est relatif
Posté le 14-04-2006 à 00:06:38  profilanswer
 

et si vraiment tu pige pas, l'explication des pointeurs...en vidéo  [:theepsilon]  
http://cslibrary.stanford.edu/104/


---------------
my flick r - Just Tab it !
n°1346562
mbarekh
Posté le 14-04-2006 à 00:35:10  profilanswer
 

très marrante la video mais bien explicative.merci

n°1346608
_darkalt3_
Proctopathe
Posté le 14-04-2006 à 08:15:34  profilanswer
 

[:drapal] pour la vidéo :love:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  segmentation fault

 

Sujets relatifs
Fontion récursive =>Segmentation faultsegmentation fault
"Segmentation Fault" avec malloc entre 757 et 1973.[C/C++] kernel 2.6.12 => segmentation fault
dynamic_cast, segmentation fault, constructeur par copieSegmentation fault en C à la premiére ligne du programme :(
[c++] segmentation fault sur un deletepetit prob de segmentation fault
[ASM GNU x86] Problème de segmentation fault [Résolu]Quelles sont les causes de "Segmentation fault" ?
Plus de sujets relatifs à : segmentation fault


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR