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

Malloc断言失败(Malloc.c:2385),c,arrays,malloc,C,Arrays,Malloc,所以我现在正在进行矩阵计算/转换,现在出现了一个断言错误 我开始实施矩阵CRS转换,程序运行良好: 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

所以我现在正在进行矩阵计算/转换,现在出现了一个断言错误

我开始实施矩阵CRS转换,程序运行良好:

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;
}
我使用与上面相同的方法执行此操作,但现在我得到一个断言错误:

矩阵:malloc.c:2385:sysmalloc:Assertion`(old\u top==initial\u top (av)和旧尺寸==0)| |((无符号长)(旧尺寸)>=MINSIZE&& 上一个使用(旧的顶部)和((无符号长的)旧的结束和(页面大小-1))== “0)”失败


我不知道为什么。

您破坏了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));
关于风格/习惯的说明:

  • 铸造是件坏事,只能在必要时使用。它降低了编译器报告可疑类型组合的能力,并使代码更难阅读,特别是在这种情况下,它什么也不做

  • sizeof(*rowchange)通常比sizeof(type name)更可取,只是为了稍微放松耦合。它减少了检查代码审查的次数,并使意图更加明显

  • 通常,当你在这里提问时,你应该C+p一些不需要添加一吨脚手架就可以运行的东西


  • 您已损坏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));
    
    关于风格/习惯的说明:

  • 铸造是件坏事,只能在必要时使用。它降低了编译器报告可疑类型组合的能力,并使代码更难阅读,特别是在这种情况下,它什么也不做

  • sizeof(*rowchange)通常比sizeof(type name)更可取,只是为了稍微放松耦合。它减少了检查代码审查的次数,并使意图更加明显

  • 通常,当你在这里提问时,你应该C+p一些不需要添加一吨脚手架就可以运行的东西