• # Débordement de tableau ?

    Posté par . En réponse au message Segmentation fault incomprehensible. Évalué à 6.

    Tout marche bien jusqu'a ce que les parametres p1,p2,p3,p5,p6 prennent les valeurs suivantes

    p1 = 100, p2 = 1300, p3 = 4000, p5 = 55, p6 = 0

    Un tel plantage (segmentation fault lors de la manipulation de pointeurs pointant dans des tableaux) est souvent dû à un débordement des tableaux en question. D'où la question : ces valeurs sont-elles dans les bornes de tes tableaux (ou des espaces mémoire alloués dynamiquement) ?

    En passant, en C, pour un tableau de taille N (i.e. dont les indices valides vont de 0 à N-1 inclus), le fait même de calculer l'adresse du pseudo-élément d'indice supérieur à N cause un comportement indéfini (*). Si la même chose est valable en C++ (je n'en sais rien), alors il est possible que tes incrémentations pi += pasi débordent les tableaux, et que cela suffise à causer un plantage.

    Plus concrètement : si on suppose
    int array[10];
    p.mhm=&array[0];
    p.mhM = 10;
    p.mhs = 3;
    Alors, lors de la boucle for (p.p2=p.mhm;p.p2<=p.mhM;p.p2=p.p2+p.mhs) { /* ... */ }, p.p2 prendra les valeurs &array[0], &array[3], &array[6], &array[9] sans problème. Puis, à la fin de la 4e itération, l'incrément affectera la valeur "&array[12]", qui est invalide. En C, le comportement indéfini surviendrait ici, et se manifesterait probablement par un segmentation fault sur ton système.

    A toi de voir si ton code permet d'être dans une telle situation, et si le comportement indéfini s'applique aussi en C++.

    (*) Le calcul de l'adresse du pseudo-élément d'indice N est par contre bien défini, c'est une exception tolérée pour faciliter les traitements de tableaux par pointeurs. Par contre, essayer d'accéder (en lecture ou en écriture) au contenu de ce pseudo-élément (qui n'existe pas) cause un comportement indéfini. Tout ceci est valable en C, je le rappelle ; je ne sais pas si ça concerne aussi le C++.