Я пишу код, который принимает матрицу в формате CSR и пытается сгенерировать другую матрицу, которая хранит только нижнюю часть (включая диагональ) исходной матрицы.
При создании нижней матрицы (называемой'trila') Я выделяю память для ее хранения, а затем заполняю массивы itrila
jtrila
trila
соответствующими значениями. Начало циклов работает нормально, пока я не получу
realloc(): invalid next size
Aborted (core dumped)
Как я понимаю, должна быть проблема с кучей, но я ее не понимаю. Далее следует то, что я могу разумно представить, чтобы понять проблему.
3 массива, необходимых для формата CSR, объявлены в main.c
, заполнены другой функцией, которая получает их указатель, а затем передаются tril()
. Основная функция очень длинная, поэтому я пишу ее не целиком, а единственную часть, в которой используется моя функция tril()
. Обратите внимание, что эти 3 массива, относящиеся к матрице trila
, не используются в других частях кода
main.c
int *itrila;
int *jtrila;
double *trila;
tril(ia, ja, a, &itrila, &jtrila, &trila, &nnz, &n);
free(itrila); free(jtrila); free(trila);
tril.c
#include <stdlib.h>
#include <stdio.h>
int tril(int *ia, int *ja, double *a, int **itrila, int **jtrila, double **trila, int *nnz, int *n)
/*
*/
{
int i, j;
int trilnnz;
trilnnz = *nnz - (*nnz - *n)/2;
printf("nnz = %d, n = %d, trilnnz = %d\n", *nnz, *n, trilnnz);
*itrila = malloc((*n + 1) * sizeof(int));
*jtrila = malloc(trilnnz * sizeof(int));
*trila = malloc(trilnnz * sizeof(double));
if (*itrila == NULL || *jtrila == NULL || *trila == NULL) {
printf("\n ERROR : not enough memory to generate the lower part of the matrix.\n\n");
return 1;
}
(*itrila)[0] = 0;
trilnnz = 0;
for (i = 0; i < *n; i++){
for (j = ia[i]; j < ia[i+1]; j++){
if (ja[j] <= i){
(*trila)[j] = a[j];
(*jtrila)[j] = ja[j];
trilnnz++;
printf("line = i = %d, column = (*jtrila)[%d] = %d, (*trila)[%d] = %f, trilnnz = %d\n", i, j, (*jtrila)[j], j, (*trila)[j], trilnnz);
}
}
(*itrila)[i+1] = trilnnz;
printf("(*itrila)[%d] = %d\n", i+1, (*itrila)[i+1]);
}
printf("Out\n");
(*itrila)[*n] = trilnnz;
printf("%d %d\n", (*itrila)[*n], (*itrila)[*n-1]);
return 0;
}
Может ли кто-нибудь помочь мне?
Заранее спасибо.