0

Pourquoi ce programme segfault sur une valeur différente de i à chaque fois?Violation liée au tableau: segfault à différents index

#include <stdio.h> 
int main() { 

    int a[16], i = 0; 
    while(1) { 
    a[i] = i; 
    printf("%d\n", a[i]); 
    i++; 
    } 
} 
+0

De quel langage de programmation s'agit-il? Est-ce C? Veuillez marquer votre question avec la langue utilisée. Pour mettre à jour votre question, cliquez sur le lien ** "[edit]" ** sous la publication. Je vous remercie. – Pang

Répondre

0

Je pense que cela sera dû à la façon dont C alloue la mémoire. Lorsque vous utilisez la ligne

int a[16] 

Ce que vous dites en substance est «me allouer suffisamment d'espace mémoire pour contenir seize entiers, à partir d'un point donné (appeler ce point x).

Alors quand vous dites que

while(1) { 
    a[i] = i; 
    printf("%d\n", a[i]); 
    i++; 
} 

Vous dites, pour toujours, définissez l'indice ith de a être i et l'imprimer. Cela fonctionne en commençant à x et en se déplaçant ensuite, un index à la fois. Pour les seize premiers entiers, c'est bien, car vous avez effacé l'espace pour le faire. Cependant, lorsque vous dépassez cette limite, vous n'avez pas effacé l'espace, vous ne savez donc pas ce qu'il y a et ce que vous pouvez écraser ou imprimer. Cela pourrait être bien pendant un moment, mais vous arriverez à un point où vous ne pouvez pas écraser ce qui est en mémoire (ce n'est pas gratuit). À ce stade, vous obtenez votre . Comme chaque fois que vous exécutez le programme, vous allouerez de l'espace à un endroit différent, il faudra un nombre différent d'itérations pour atteindre le point où la mémoire est prise, et ainsi vous aurez segfault à différents index.

+0

L'explication de, pourquoi le code ne segfault sur i = 16, est que le programme n'est pas alloué 16 * sizeof (int) octets de mémoire, mais une page entière sur la pile par le système d'exploitation. Le matériel détecte la violation de la limite de page et déclenche une interruption pour le traitement du système d'exploitation, puis le système d'exploitation envoie un signal de segmentation au processus. Cependant, cela n'explique toujours pas les différentes valeurs de i si nous exécutons le programme plusieurs fois, car la taille de la page donnée au programme sera toujours la même. – Abhijit

+0

Pouvez-vous lier d'où vous l'avez obtenu? – JCollerton

+0

Tout le programme est affecté à un segment de mémoire pour l'allocation dynamique de la mémoire, mais cette fonction n'alloue pas la mémoire dynamiquement. Cet appel de fonction utilisera la mémoire de la pile pour stocker les variables locales. Il va allouer un bloc de la pile d'une taille fixe (comme l'allocation de mémoire dynamique est faite sur le tas) et il déterminera cette taille à partir de la taille du tableau que vous lui avez donné. Ensuite, lorsque vous courez au-dessus de cette taille, vous obtiendrez le problème ci-dessus. – JCollerton