sirve que para funciona funcion example como comando c free

funciona - para que sirve la funcion free en c



Doble error o corrupciĆ³n(! prev) en c programa (4)

double *ptr = malloc(sizeof(double *) * TIME); /* ... */ for(tcount = 0; tcount <= TIME; tcount++) ^^

  • Estás sobrepasando la matriz. Cambie <= a < o asigne SIZE + 1 elementos
  • Su malloc está mal, querrá sizeof(double) lugar de sizeof(double *)
  • Como comenta, aunque no está directamente vinculado a su problema de corrupción, está usando *(ptr+tcount) sin inicializarlo
  • Al igual que una nota de estilo, es posible que desee utilizar ptr[tcount] lugar de *(ptr + tcount)
  • Realmente no necesitas malloc + free ya que ya sabes SIZE

Me sale el siguiente error al ejecutar el programa de CA:

*** glibc detected *** ./a.out: double free or corruption (!prev): 0x080b8008 ***

Creo que esto se debe a que se ha llamado free () al final del programa, pero no puedo averiguar dónde se ha liberado la memoria de malloc''d antes de esto. Aquí está el código:

#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; }

Esto se compila con:

gcc -Wall -g -lm test.c

Valgrind:

valgrind --leak-check=yes ./a.out

da:

==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)

No tengo mucha experiencia con idiomas que no gestionan su propia memoria automáticamente (por lo tanto, este ejercicio en c para aprender un poco) pero estoy atascado. Cualquier ayuda sería apreciada.

Se supone que el código es parte de un sintetizador de audio aditivo. En ese sentido, funciona y da la salida correcta almacenada en ptr.

Gracias.


1 - Tu malloc () está equivocado.
2 - Usted está sobrepasando los límites de la memoria asignada
3 - Debes inicializar tu memoria asignada

Aquí está el programa con todos los cambios necesarios. Compilé y corrí ... sin errores ni advertencias.

#include <stdio.h> #include <stdlib.h> //malloc #include <math.h> //sine #include <string.h> #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); //memset( ptr, 0x00, sizeof(double) * TIME); may not always set double to 0 for( tcount = 0; tcount < TIME; tcount++ ) { ptr[tcount] = 0; } tcount = 0; 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; }


Cambia esta linea

double *ptr = malloc(sizeof(double *) * TIME);

a

double *ptr = malloc(sizeof(double) * TIME);


No verifiqué todo el código, pero supongo que el error está en la llamada a malloc. Tienes que reemplazar

double *ptr = malloc(sizeof(double*) * TIME);

para

double *ptr = malloc(sizeof(double) * TIME);

ya que desea asignar el tamaño para un doble (no el tamaño de un puntero a un doble).