运行c程序时出现以下错误: * ./final'出错:double free或broken(!prev):0x0000000000c2f010 *
我相信这是因为在结束时调用了free() 程序,但我无法弄清楚malloc的内存在哪里 在此之前被释放。这是代码:
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
#include <time.h>
#include <stdlib.h>
static int DIM = 1000; // Golbal variable for Matrices Dimentions
int isPrime(unsigned int number);
int countPrimes(int **matrix);
int main() {
time_t tic = clock();
int **matrixA;//
int **matrixB;
int **mult;
int k = 0, sum=0;
time_t t;
int i =0,j;
// Allocate dynamic memory for Matrices A,B && mult first (rows) dimension
matrixA = (int **) malloc (DIM * sizeof (int *));
matrixB = (int **) malloc (DIM * sizeof (int *));
mult = (int **) malloc (DIM * sizeof (int *));
// Allocate dynamic memory for Matrices A,B && mult second (rows) dimension, && Initialize elements to "0" For Matrices B && Mult
for (k = 0; k < DIM; k++) {
matrixA[k] = (int *) calloc (DIM, sizeof (int *));
matrixB[k] = (int *) calloc (DIM, sizeof (int *));
mult[k] = (int *) calloc (DIM, sizeof (int *));
}
// Generate random numbers for matrix A elements
for (i = 0; i < DIM; i++)
{
for (j = 0; j < DIM; j++)
{
matrixA[i][j] = (rand() % 100)+1 ;
printf("%d ",matrixA[i][j]);
}
}
// Do the matrix multiplication
for (i = 0; i < DIM; i++) {
for (j = 0; j < DIM; j++) {
for (k = 0; k < j; k++) {
sum += matrixA[i][k] * matrixB[k][j];
}
mult[i][j] = sum;
sum = 0;
}
}
int total = countPrimes(matrixA);
printf("\n\nnumber of primes in a : %d\n\n", total);
// Delete the dynamic memory of Matrix A
for (i = 0; i < DIM; i++) { // free first matrix
free(*(matrixA+i));
}
free(matrixA);
// Delete the dynamic memory of Matrix B
for (i = 0; i < DIM; i++) { // free first matrix
free(*(matrixB+i));
}
free(matrixA);
// Delete the dynamic memory of Matrix B
for (i = 0; i < DIM; i++) { // free first matrix
free(*(matrixB+i));
}
free(matrixA);
// Compute SpeedUp
time_t toc = clock();
double time = (double) (toc - tic) / CLOCKS_PER_SEC;
printf("The amount of time the OS has spent running your process is : %lf seconds\n\n\n", time);
return 0;
}
// Check elements of Matrix A if its a Prime number or not
int isPrime(unsigned int number) { // Psitive numbers could be Prime numbers only
if (number <= 1) return 0; // zero and one are not prime
unsigned int i;
for (i=2; i*i<=number; i++) {
if (number % i == 0) return 0;
}
return 1;
}
// Count number of prime numbers in Matrix A
int countPrimes(int **matrix) {
int row, col;
int flag = 0;
int total = 0;
for (row = 0; row < DIM; row++) {
for (col = 0; col < DIM; col++) {
flag = isPrime(matrix[row][col]);
if(flag == 1)
total++;
}
}
return total;
}
答案 0 :(得分:1)
您的错误在这里:
// Delete the dynamic memory of Matrix A
for (i = 0; i < DIM; i++) { // free first matrix
free(*(matrixA+i));
}
free(matrixA);
// Delete the dynamic memory of Matrix B
for (i = 0; i < DIM; i++) { // free first matrix
free(*(matrixB+i));
}
free(matrixA);
// Delete the dynamic memory of Matrix B
for (i = 0; i < DIM; i++) { // free first matrix
free(*(matrixB+i));
}
free(matrixA);
注意你free(matrixA)
三次,即使你打算释放matrixB和matrixC。你也错误地在两个不同的循环中使用free(*(matrixB+i));
。