double erreur gratuite ou corruption (! prev) dans le programme c
J'obtiens l'erreur suivante lors de l'exécution d'un programme c:
*** glibc detected *** ./a.out: double free or corruption (!prev): 0x080b8008 ***
Je crois que cela est dû à free() d'être appelé à la fin du programme, mais je ne peux pas comprendre où le malloc avais de la mémoire est libérée avant cette. Voici le code:
#include <stdio.h>
#include <stdlib.h> //malloc
#include <math.h> //sine
#define TIME 255
#define HARM 32
int main (void) {
double sineRads;
double sine;
int tcount = 0;
int hcount = 0;
/* allocate some heap memory for the large array of waveform data */
double *ptr = malloc(sizeof(double *) * TIME);
if (NULL == ptr) {
printf("ERROR: couldn't allocate waveform memory!\n");
} else {
/*evaluate and add harmonic amplitudes for each time step */
for(tcount = 0; tcount <= TIME; tcount++){
for(hcount = 0; hcount <= HARM; hcount++){
sineRads = ((double)tcount / (double)TIME) * (2*M_PI); //angular frequency
sineRads *= (hcount + 1); //scale frequency by harmonic number
sine = sin(sineRads);
*(ptr+tcount) += sine; //add to other results for this time step
}
}
free(ptr);
ptr = NULL;
}
return 0;
}
C'est compilé avec:
gcc -Wall -g -lm test.c
Valgrind:
valgrind --leak-check=yes ./a.out
donne:
==3028== Memcheck, a memory error detector
==3028== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==3028== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==3028== Command: ./a.out
==3028==
==3028== Invalid read of size 8
==3028== at 0x8048580: main (test.c:25)
==3028== Address 0x41ca420 is 1,016 bytes inside a block of size 1,020 alloc'd
==3028== at 0x4024F20: malloc (vg_replace_malloc.c:236)
==3028== by 0x80484F8: main (test.c:15)
==3028==
==3028== Invalid write of size 8
==3028== at 0x8048586: main (test.c:25)
==3028== Address 0x41ca420 is 1,016 bytes inside a block of size 1,020 alloc'd
==3028== at 0x4024F20: malloc (vg_replace_malloc.c:236)
==3028== by 0x80484F8: main (test.c:15)
==3028==
==3028==
==3028== HEAP SUMMARY:
==3028== in use at exit: 0 bytes in 0 blocks
==3028== total heap usage: 1 allocs, 1 frees, 1,020 bytes allocated
==3028==
==3028== All heap blocks were freed -- no leaks are possible
==3028==
==3028== For counts of detected and suppressed errors, rerun with: -v
==3028== ERROR SUMMARY: 8514 errors from 2 contexts (suppressed: 14 from 7)
Je n'ai pas beaucoup d'expérience avec les langues qui n'ont pas de gérer leurs propres automatiquement la mémoire (d'où cet exercice en c pour en savoir un peu), mais je suis coincé. Toute aide serait appréciée.
Le code est censé faire partie d'un additif audio de la synthèse. A cet égard, il fonctionne et donne des résultats corrects stockées dans ptr.
Grâce.
source d'informationauteur user1640921
Vous devez vous connecter pour publier un commentaire.
<=
à<
ou allocSIZE + 1
élémentsmalloc
est mauvais, vous aurez enviesizeof(double)
au lieu desizeof(double *)
ouah
commentaires, bien que n'étant pas directement lié à votre problème de corruption, vous êtes à l'aide de*(ptr+tcount)
sans l'initialiserptr[tcount]
au lieu de*(ptr + tcount)
malloc
+free
puisque vous savez déjàSIZE
Modifier cette ligne
à
1 - Votre malloc() est faux.
2 - Vous d'excéder les limites de la mémoire allouée
3 - Vous devez initialiser votre mémoire allouée
Voici le programme avec tous les changements nécessaires. J'ai compilé et exécuté... pas d'erreurs ou d'avertissements.
Je n'ai pas regardé le code, mais ma conjecture est que l'erreur est dans le malloc appel. Vous devez remplacer
pour
puisque vous voulez allouer la taille pour un double (pas la taille d'un pointeur vers un double).