segmentation fault

segmentation fault - C - Programmation

Marsh Posté le 13-04-2006 à 23:23:58    

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 :)

Reply

Marsh Posté le 13-04-2006 à 23:23:58   

Reply

Marsh Posté le 13-04-2006 à 23:28:26    

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

Reply

Marsh Posté le 13-04-2006 à 23:35:26    

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

Reply

Marsh Posté le 13-04-2006 à 23:37:15    

mais tu sais c'est quoi un pointeur ?

Reply

Marsh Posté le 13-04-2006 à 23:40:07    

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

Reply

Marsh Posté le 13-04-2006 à 23:43:47    

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

Reply

Marsh Posté le 13-04-2006 à 23:45:27    


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

Reply

Marsh Posté le 13-04-2006 à 23:46:38    

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/
Reply

Marsh Posté le 13-04-2006 à 23:46:57    

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?

Reply

Marsh Posté le 13-04-2006 à 23:50:50    

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.

Reply

Marsh Posté le 13-04-2006 à 23:50:50   

Reply

Marsh Posté le 13-04-2006 à 23:54:24    

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 !
Reply

Marsh Posté le 13-04-2006 à 23:56:47    

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/
Reply

Marsh Posté le 13-04-2006 à 23:57:11    

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".

Reply

Marsh Posté le 14-04-2006 à 00:00:09    

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.

Reply

Marsh Posté le 14-04-2006 à 00:04:13    

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/
Reply

Marsh Posté le 14-04-2006 à 00:06:38    

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 !
Reply

Marsh Posté le 14-04-2006 à 00:35:10    

très marrante la video mais bien explicative.merci

Reply

Marsh Posté le 14-04-2006 à 08:15:34    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed