Утверждение Malloc не удалось (malloc.c: 2385) - PullRequest
0 голосов
/ 02 мая 2019

Так что я сейчас делаю Матричные вычисления / преобразования, и теперь появилась ошибка утверждения.

Я начал внедрять Matrix-CRS-Conversion, и программа прекрасно работает:

uint32_t size = 0;
for (uint32_t i = 0; i < ROWS; i++)
{
    for (uint32_t j = 0; j < COLUMNS; j++)
    {
        if(Matrix[i][j] != 0) 
            size++;
    }
}

// Allocating memory for CRS
uint32_t *values = (uint32_t*)malloc(size * sizeof(uint32_t));
uint32_t *columnindex = (uint32_t*)malloc(size * sizeof(uint32_t));
uint32_t *rowchange =  (uint32_t*)malloc(ROWS+1 * sizeof(uint32_t));

uint32_t position = 0;
uint32_t rowPtr = 0;
rowchange[0] = 0;
rowchange[ROWS] = size;

for (uint32_t i = 0; i < ROWS; i++)
{
    for (uint32_t j = 0; j < COLUMNS; j++)
    {
        if(Matrix[i][j] != 0) {
            values[position] = Matrix[i][j];
            columnindex[position] = j;
            position++;
        }
     }
     rowPtr++;
     if(rowPtr != ROWS)
         rowchange[rowPtr] = position;
}

Когда я распечатываю результаты, все правильно, как задумано.

Теперь я хотел реализовать умножение матрицы на вектор и начал выделять память для вектора для умножения и вектора результата:

uint32_t *multvector = (uint32_t*)malloc(ROWS * sizeof(uint32_t));
uint32_t *result = (uint32_t*)malloc(ROWS * sizeof(uint32_t));

Я сделал это так же, как и выше, но теперь я получаю сообщение об ошибке:

Матрица: malloc.c: 2385: sysmalloc: утверждение `(old_top == initial_top (av) && old_size == 0) || ((без знака long) (old_size)> = MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0) 'не удалось.

Понятия не имею, почему.

1 Ответ

2 голосов
/ 02 мая 2019

Вы испортили кучу malloc, скорее всего:

uint32_t *rowchange =  (uint32_t*)malloc(ROWS+1 * sizeof(uint32_t));

должно было быть:

 uint32_t *rowchange =  (uint32_t*)malloc((ROWS+1) * sizeof(uint32_t));

или, еще лучше:

 uint32_t *rowchange =  malloc((ROWS+1) * sizeof(*rowchange));

Примечания по стилю / привычкам:

  1. Кастинг - это плохая вещь , и должен использоваться только при необходимости. Это уменьшает способность компилятора сообщать о сомнительных комбинациях типов и затрудняет чтение кода, особенно в таких случаях, когда он ничего не делает.

  2. sizeof (* rowchange) обычно предпочтительнее sizeof (type-name) просто для того, чтобы немного ослабить связь. Это уменьшает количество вещей, которые нужно проверить для проверки кода, и делает намерение более очевидным.

  3. Как правило, вы должны C + P что-то, что можно запустить без добавления тонны строительных лесов, когда вы задаете вопросы здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...