Malloc断言失败(malloc.c:2385)

时间:2019-05-02 16:45:59

标签: c arrays malloc

因此,我现在正在这样做,现在出现了断言错误。

我开始实现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)|| ((无符号长)(old_size)> = MINSIZE &&   prev_inuse(old_top)&&((无符号长)old_end&(页面大小-1))==   0)'失败。

我不知道为什么。

1 个答案:

答案 0 :(得分:2)

您很有可能破坏了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操作,而不必添加一吨脚手架。