2017-06-03 85 views
-1

运行C程序时,我得到了以下错误:*错误的`./final“:双重释放或腐败(!上一页):0x0000000000c2f010 *双重释放或腐败(上一个!)

我相信这是由于免费()在 程序结束时被调用,但我无法弄清楚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

欢迎来到Stack Overflow。请查看[Tour](https://stackoverflow.com/tour)和[Asking](https://stackoverflow.com/help/asking)。 – Shiro

+0

*** ./final错误:double free或corruption(!prev):0x0000000000c2f010 *** ======= Backtrace:========= /lib/x86_64- linux-gnu/libc.so.6(+ 0x777e5)[0x7f3bc0d747e5] /lib/x86_64-linux-gnu/libc.so.6(+0x7fe0a)[0x7f3bc0d7ce0a] /lib/x86_64-linux-gnu/libc。 so.6(cfree + 0x4c)[0x7f3bc0d8098c] ./final[0x4009db] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f3bc0d1d830] ./final[0x4005b9] = ======内存映射:======== 00400000-00401000 r-xp 00000000 08:0b 1966527/home/suhaib/Desktop/final 00600000-00601000 r - p 00000000 08:0b 1966527 –

+0

墙上的垃圾属于你的问题,而不是评论。而且,你的内维'calloc(DIM,sizeof(int *));'分配全部使用了错误的'sizeof'。他们应该使用'sizeof(int)' – WhozCraig

回答

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

相关问题