Bonjour,

J'ai une erreur de segmentation que je n'arrive pas à comprendre. Mon code est le suivant

Code Erreur de segmentation : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char *argv[])
{
  int n;                
  char **endp;
 
  n = (int) strtol(argv[1], endp, 10);
 
  printf("%d \t %d \t %d \n", n, 4, 4);
 
  return 0;
}

Quand je compile ce code avec gcc puis que je l'exécute par exemple avec ./main 4 si main est le nom de mon programme compilé, j'obtiens une erreur de segmentation. Voici le rapport de valgrind :

Code Valgrind : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
==9888== Memcheck, a memory error detector
==9888== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==9888== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==9888== Command: ./main 4
==9888==
==9888== Conditional jump or move depends on uninitialised value(s)
==9888==    at 0x4077A42: ____strtol_l_internal (strtol_l.c:489)
==9888==    by 0x407761F: strtol (strtol.c:110)
==9888==    by 0x804841C: main (in /home/tlaffarg/Documents/Simulations/A/main)
==9888==
==9888== Use of uninitialised value of size 4
==9888==    at 0x4077A47: ____strtol_l_internal (strtol_l.c:490)
==9888==    by 0x407761F: strtol (strtol.c:110)
==9888==    by 0x804841C: main (in /home/tlaffarg/Documents/Simulations/A/main)
==9888==
==9888==
==9888== Process terminating with default action of signal 11 (SIGSEGV)
==9888==  Bad permissions for mapped region at address 0x4188FF4
==9888==    at 0x4077A47: ____strtol_l_internal (strtol_l.c:490)
==9888==    by 0x407761F: strtol (strtol.c:110)
==9888==    by 0x804841C: main (in /home/tlaffarg/Documents/Simulations/A/main)
==9888==
==9888== HEAP SUMMARY:
==9888==     in use at exit: 0 bytes in 0 blocks
==9888==   total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==9888==
==9888== All heap blocks were freed -- no leaks are possible
==9888==
==9888== For counts of detected and suppressed errors, rerun with: -v
==9888== Use --track-origins=yes to see where uninitialised values come from
==9888== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 12 from 7)

Ce qui m'étonne particulièrement est que les trois codes sources suivant, qui viennent du précédent légèrement modifié, fonctionnent :

Code Afficher un 4 en moins : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char *argv[])
{
  int n;                
  char **endp;               // Buffer used to read the input variables
 
  n = (int) strtol(argv[1], endp, 10);
 
  printf("%d \t %d \n", n, 4);
 
  return 0;
}


Code Ne pas rentrer l'entrée depuis l'extérieur du programme : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char *argv[])
{
  int n;                
  char **endp;               // Buffer used to read the input variables
 
  n = 4;
 
  printf("%d \t %d \t %d \n", n, 4, 4);
 
  return 0;
}


Code Utiliser &endp sur *endp au lieu de endp sur **endp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char *argv[])
{
  int n;                
  char *endp;
 
  n = (int) strtol(argv[1], &endp, 10);
 
  printf("%d \t %d \t %d \n", n, 4, 4);
 
  return 0;
}

Quelqu'un pourrait-il m'expliquer ce qui ne va pas dans le premier code?

Merci d'avance!