Erreur de déstabilisation de la mémoire

J’ai un petit morceau de code. Je l’ai compilé avec -lmcheck pendant que j’essaye de déboguer un code dans lequel j’ai la même erreur.

Je reçois cette erreur quand je lance ce code:

 memory clobbered before allocated block 

Quelqu’un peut-il expliquer la raison pour laquelle free(ptr) va me jeter cette erreur?

Sinon, comment puis-je libérer le pointeur?

Merci.

 #include  #include  #include  #include  #define LEN 5 int main(int argc, char *argv[]){ char *ptr = NULL; ptr = (char *) malloc(LEN+1);// +1 for ssortingng strcpy(ptr, "hello"); int i = 0; for(i = 0; i<LEN; i++) { printf("ptr[%d] = %c\n", i, ptr[i]); ptr++; } free(ptr); return 0; } 

Vous incrémentez ptr et changez donc l’adresse vers laquelle il pointe. Tu ne peux pas faire ça.

Dans votre cas, ayez un pointeur séparé, disons char * p = ptr et effectuons vos opérations avec p laissant ptr intact afin que vous puissiez free(ptr) plus tard.

EDIT Après avoir examiné votre code une seconde fois, j’ai trouvé que vous ptr++ alors que vous ne devriez pas. Vous accédez aux caractères du tableau comme ptr[i] . Si vous vous trompez avec le pointeur ptr , vous modifiez l’adresse de base et accéder aux caractères avec ptr[i] peut conduire (et conduira) à des résultats inattendus.

Si vous supprimez simplement cette ligne ( ptr++ ), votre code fonctionnera comme par magie. Si vous souhaitez explorer le concept de pointeur et essayer une autre solution, votre code pourrait ressembler à ceci:

 int main(int argc, char *argv[]){ char *ptr = NULL; char * p; ptr = (char *) malloc(LEN+1);// +1 for ssortingng (please check for NULL) p = ptr; strcpy(ptr, "hello"); int i = 0; while (*p) // note how I changed it to a while loop, C ssortingngs are NULL terminated, so this will break once we get to the end of the ssortingng. What we gain is that this will work for ANY ssortingng size. { printf("ptr[%d] = %c\n", i++, *p); // here i dereference the pointer, accessing its individual char p++; } free(ptr); return 0; } 

Parce que ptr ne pointe plus vers la base de la mémoire que vous avez allouée.

En outre, après avoir incrémenté ptr , l’expression ptr[i] ne renvoie pas ce à quoi vous pourriez vous attendre. et c’est pourquoi la sortie commence par “hlo”.

Trouvez la réponse dans les commentaires. Lorsque vous allouez de la mémoire, généralement, la structure de gestion de la mémoire en garde trace en ajoutant des informations supplémentaires (vous pouvez dire En-tête et Pied de page) à la zone de mémoire allouée. Lorsque vous libérez cette mémoire, les mêmes informations sont associées afin de détecter tout access indésirable / invalide à la mémoire.

 int main(int argc, char *argv[]){ char *ptr = NULL; char* temp = NULL; // Have a temp pointer. ptr = (char *) malloc(LEN+1);// +1 for ssortingng strcpy(ptr, "hello"); temp = ptr; // manipulate temp pointer instead of ptr itself int i = 0; for(i = 0; i