realloc (): неверный следующий размер;Прервано (сброшено ядро), когда realloc () не используется в коде - PullRequest
0 голосов
/ 06 ноября 2019

Я пишу код, который принимает матрицу в формате 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;
}


Может ли кто-нибудь помочь мне?

Заранее спасибо.

...