erreur de segmentation
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

erreur de segmentation



  1. #1
    cosmoff

    erreur de segmentation


    ------

    Bonjour à tous,

    voici mon code ca sera plus claire :
    Code:
    int main(int argc, char const *argv[])
    {
    	int *tab = (int*) malloc(10*sizeof(int));
    
    	for (int i = 0; i < 10; ++i)
    	{
    		tab[i] = i;
    	}
    	tab[120] = 10;
    	std::cout << tab[120] << std::endl;
    
    	int tableau[10] = {0};
    	tableau[120] = 6;
    	std::cout << tableau[120] << std::endl;
    
    
    	char *str = NULL;
    	str[0] = 'c';
    
    
    	free(tab);
    
    	return 0;
    }
    voila dans le dernier cas ou je fais str[0] j'ai une erreur de segmentation (ce qui est logique) mais pour les cas tableau[120] = 6 et tab[120] = 10 je n'ai pas d'erreur, alors que je suis dans une case mémoire que je ne devais pas pouvoir modifier.
    Pourquoi le mmu ne lance pas une erreur au noyau pour tuer mon processus ?

    Merci d'avance pour votre aide

    -----

  2. #2
    pm42

    Re : erreur de segmentation

    Citation Envoyé par cosmoff Voir le message
    mais pour les cas tableau[120] = 6 et tab[120] = 10 je n'ai pas d'erreur, alors que je suis dans une case mémoire que je ne devais pas pouvoir modifier.
    Pourquoi le mmu ne lance pas une erreur au noyau pour tuer mon processus ?
    Parce que le C est un langage de bas niveau : il prend l'adresse de base, ajoute ton indice et va taper à cet endroit là de la mémoire. Tant que tu restes dans l'espace déjà alloué, tu n'auras pas d'erreur.
    Ce qui veut dire que tu peux potentiellement modifier n'importe quelle zone mémoire sans t'en rendre compte.

    De plus, dans certaines implémentations, malloc alloue plus que ce que tu demandes. La version historique (BSD) alloue par exemple uniquement des puissances de 2. Donc si tu demandes 10000 octets, tu vas en avoir 16384 et tu n'as vraiment aucun moyen de détecter que tu as dépassé les 10000.

    Il existe différents outils qui permettent de détecter ce genre d'erreur mais cela dépend de l'environnement que tu utilises. Et je ne peux pas te guider, cela fait un bout de temps que je ne code plus en C sauf exception.

  3. #3
    invite9dc7b526

    Re : erreur de segmentation

    as-tu essayé de remplacer la valeur 120 par une beaucoup plus grande? je pense que quand un programme est chargé en mémoire il lui est alloué une taille minimale qui dépend du système mais qui doit être de 4kb ou 16kb, quelque-chose comme ça. Tant que tu ne sors pas de là il n'y a pas de message d'erreur.

  4. #4
    invitebedc5d30

    Re : erreur de segmentation

    Dans le cas du pointeur NULL, son adresse pointe sur 0 donc pas dans le même segment mémoire; on met souvent un point d'arrêt à l'adresse 0 avec un debugger pour pister ce problème.
    Pour ton tableau, il va être alloué dans la heap, donc dans une zone d'adressage qui t'est réservé et tu ne verra le défaut effectivement que quand tu vas sortir de celui-ci.

  5. A voir en vidéo sur Futura

Discussions similaires

  1. Fortran : erreur de segmentation.
    Par invite93ac6dc9 dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 18/12/2012, 09h48
  2. Erreur de segmentation (séries de Fourier)
    Par invitee495456e dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 03/12/2011, 08h47
  3. [Divers] Segmentation
    Par invitec44e9f82 dans le forum Biologie
    Réponses: 1
    Dernier message: 06/03/2009, 16h18
  4. Erreur de segmentation sous fedora
    Par invite70eda27f dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 26/02/2008, 22h02
  5. c++:erreur de segmentation!
    Par invitef666d0fa dans le forum Logiciel - Software - Open Source
    Réponses: 6
    Dernier message: 06/12/2006, 19h36