Question

int main ()
{
    int * b;
    b = (int*) malloc (1);
    *b=110000;
    free (b);
    return 0;
}

Pourquoi la corruption tas arrive à free (b);?

l'OMI, la corruption du tas se produit déjà à *b=110000;.

Était-ce utile?

La solution

L'argument de malloc() est le nombre d'octets à allouer. Vous devez utiliser:

b = (int*) malloc(sizeof(int));

Vous avez attribué trop petit bloc, puis écrit plus d'octets à ce que vous avez alloué, qui remplace l'information de tenue de livres à côté du bloc, corrompant le tas.

Autres conseils

Il est à * b = 110000; Parce que vous allouez la mémoire pour un octet, puis assignez un int dans ce qui est plus d'un octet. Soit vous pouvez avoir b = (int *) malloc (sizeof (int)) ou au lieu de int * b vous pouvez avoir char * b puis jeter le pointeur à malloced char *. Le code peut même fonctionner si vous attribuez une valeur qui est inférieure à 128 (en raison de signed char) à * b.

EDIT: - Je pense que parfois même cela fonctionnera sans aucun tracas. Parce que le compilateur peut choisir d'affecter plus d'un octet de mémoire pour un accès rapide des données.

La corruption du tas se fait déjà à l'affectation de *b=11000, mais il est pas détecté jusqu'à ce que l'appel free(b) parce que c'est le premier point où l'intégrité du tas est vérifié à nouveau.

Vérifier l'intégrité du tas à chaque mission (ou même chaque mission impliquant un pointeur déréférencé) ralentirait la plupart des programmes trop bas et il lierait le compilateur trop étroitement à la mise en œuvre bibliothèque. Pour cette raison, les contrôles d'intégrité ne sont effectués que lorsque le tas se manipule, qui est dans les fonctions de malloc et free (amis) et.

Le code écrit plus de données sur le bloc de mémoire que l'espace dont il dispose corrompant d'où le début du prochain bloc de mémoire valide.

Utilisation de char * plutôt que int * et écrire une valeur -128 à 127 à * b devrait fixer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top