gpt4 book ai didi

c - 双重释放或腐败(!prev)

转载 作者:行者123 更新时间:2023-11-30 19:08:48 35 4
gpt4 key购买 nike

I get the following error when running a c program: * Error in `./final': double free or corruption (!prev): 0x0000000000c2f010 *

I believe this is due to free() being called at the end of the program, but I can't figure out where the malloc'd memory is being freed prior to this. Here is the code:

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

最佳答案

您的错误在这里:

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

关于c - 双重释放或腐败(!prev),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44349329/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com