双重免费或腐败(!prev)

时间:2017-06-03 23:10:13

标签: c matrix

  

运行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;
}

1 个答案:

答案 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));