glibc detected free(): invalid next size (fast)
bins =(double*)malloc(nbins * sizeof(double));
bin_counts =(int*)malloc((nbins-1) * sizeof(int));
//create bins from intervals
for(j=0; j<=(nbins); j++)
{
bins[j] = m + (j*interval);
}
//generate "bin_counts[]" with all 0's
for(y=0; y<=(nbins-1); y++)
{
bin_counts[y] = 0;
}
You are overstepping your arrays, you allocate place for nbins
doubles but write to nbins+1
locations, and use nbins
locations for bin_counts
but have only allocated nbins-1
.
Wade G
Updated on January 31, 2020Comments
-
Wade G about 4 years
This code generates random numbers and then produces a histogram based on input to the functions regarding the intervals. "bins" represents the histogram intervals and "bin_counts" holds the number of random numbers in a given interval.
I've reviewed several of the posts dealing with similiar issues and I understand that I'm out of bounds in the memory somewhere but GBD only points me to the "free(bins);" at the end of the code. I've double-checked my array lengths and I think they are all correct in terms of not accessing elements that don't exist/writing to memory not allocated. The weird thing is that the code works as intended, it produces an accuarate histogram, now I just need helping cleaning up this free() invalid next size error. If anybody has any suggestions I would be much obliged. The whole output is :
glibc detected ./file: free(): invalid next size (fast): 0x8429008
followed by a bunch of addresses in memory, seperated by Backtrace and Memory Map. The Backtrace only points me towards line 129, which is "free(bins);". Thanks in advance
#include "stdio.h" #include "string.h" #include "stdlib.h" void histo(int N, double m, double M, int nbins, int *bin_counts, double *bins); int main(int argc, char* argv[]) { int *ptr_bin_counts; double *ptr_bins; histo(5,0.0,11.0,4, ptr_bin_counts, ptr_bins); return 0; } void histo(int N, double m, double M, int nbins, int *bin_counts, double *bins) { srand(time(NULL)); int i,j,k,x,y; double interval; int randoms[N-1]; int temp_M = (int)M; int temp_m = (int)m; interval = (M-m) /((double)nbins); //allocating mem to arrays bins =(double*)malloc(nbins * sizeof(double)); bin_counts =(int*)malloc((nbins-1) * sizeof(int)); //create bins from intervals for(j=0; j<=(nbins); j++) { bins[j] = m + (j*interval); } //generate "bin_counts[]" with all 0's for(y=0; y<=(nbins-1); y++) { bin_counts[y] = 0; } //Generate "N" random numbers in "randoms[]" array for(k =0; k<=(N-1); k++) { randoms[k] = rand() % (temp_M + temp_m); printf("The random number is %d \n", randoms[k]); } //histogram code for(i=0; i<=(N-1); i++) { for(x=0; x<=(nbins-1); x++) { if( (double)randoms[i]<=bins[x+1] && (double)randoms[i]>=bins[x] ) { bin_counts[x] = bin_counts[x] + 1; } } } free(bins); free(bin_counts); }