Voici des exemples de programme en C qui peuvent produire une telle erreur.
Exemple avec une variable
#include <stdio.h> int main() { int variable_entiere; scanf("%d", variable_entiere); }
La fonction scanf cherche à récupérer un entier sur l'entrée standard (par défaut, le clavier) et stocke cette valeur dans une variable. Pour pouvoir y stocker la donnée, scanf a besoin de connaître l'adresse de la variable (dans notre cas : variable_entiere).
Or, dans notre cas, la valeur de variable_entiere n'est pas initialisée et a donc une valeur quelconque. La fonction scanf tente alors d'accéder à la zone mémoire représentée par la valeur contenue dans variable_entiere et provoquera fort probablement une erreur de segmentation.
Nous voulions stocker la valeur récupérée par scanf dans variable_entiere et nous devions donc passer en argument l'adresse de notre variable (en utilisant & devant le nom de la variable) et non sa valeur.
Il aurait fallu remplacer :
scanf("%d", variable_entiere);
par :
scanf("%d", &variable_entiere);
Pour que le programme se comporte comme nous le désirions.
Exemple avec un pointeur
int main() { int *pointeur, valeur; valeur = 3; *pointeur = valeur * valeur; }
Le problème ici est que l'on veut stocker le résultat de l'opération valeur * valeur et y avoir accès par un pointeur (nommé ici pointeur). Or, un pointeur n'allouant aucun espace mémoire autre que pour lui-même, on ne peut lui affecter une valeur tant qu'il ne pointe pas sur un espace mémoire correctement alloué (comme une variable) sans risquer de provoquer une erreur de segmentation car un pointeur non initialisé pointe à un endroit aléatoire de la mémoire.
Une solution est de créer une seconde variable (nommée ici resultat) vers laquelle pointe le pointeur :
int main() { int *pointeur, valeur, resultat; pointeur = &resultat; valeur = 3; *pointeur = valeur * valeur; }