Maison  >  Article  >  développement back-end  >  En langage C, le débordement de tas et le débordement de pile font référence au moment où un programme dépasse ses limites allouées lors de l'utilisation de la mémoire tas ou de la mémoire pile.

En langage C, le débordement de tas et le débordement de pile font référence au moment où un programme dépasse ses limites allouées lors de l'utilisation de la mémoire tas ou de la mémoire pile.

王林
王林avant
2023-09-11 13:41:021338parcourir

在C语言中,堆溢出(Heap overflow)和栈溢出(Stack overflow)是指程序在使用堆内存或栈内存时超出了其分配的边界

Heap overflow

Heap est utilisé pour stocker des variables dynamiques. C'est une zone de mémoire de processus. malloc(), calloc(), resize() toutes ces fonctions intégrées sont couramment utilisées pour stocker des variables dynamiques.

Quand un débordement de tas se produit -

A) Si nous allouons une variable dynamique à grand nombre -

int main() {
   float *ptr = (int *)malloc(sizeof(float)*1000000.0));
}

B) Si nous allouons de la mémoire en continu et ne la libérons pas après utilisation.

int main() {
   for (int i=0; i<100000000000; i++) {
      int *p = (int *)malloc(sizeof(int));
   }
}

Stack Overflow

La pile est une structure de données dernier entré, premier sorti. Il est utilisé pour stocker les variables locales utilisées dans les fonctions. Les paramètres sont transmis via cette fonction et son adresse de retour.

Si le programme consomme plus d'espace mémoire, un débordement de pile se produira en raison de la taille limitée de la pile dans la mémoire de l'ordinateur.

Un débordement de pile se produit lorsque-

C) Si une fonction est appelée de manière récursive par elle-même un nombre infini de fois, alors la pile ne pourra pas stocker un grand nombre de variables locales, donc un débordement de pile se produit-

void calculate(int a) {
   if (a== 0)
      return;
      a = 6;
      calculate(a);
}
int main() {
   int a = 5;
   calculate(a);
}

D) Si un grand nombre de variables locales sont déclarées ou de grandes dimensions sont déclarées. Tableau ou matrice, peut provoquer un débordement de pile.

int main() {
   A[20000][20000]
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer