因此,我现在正在这样做,现在出现了断言错误。
我开始实现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)'失败。
我不知道为什么。
答案 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));
关于风格/习惯的注释:
铸造是一件坏事,应仅在必要时使用。这样会降低编译器报告可疑类型组合的能力,并使代码更难以阅读,尤其是在这种情况下,它什么也不做。
sizeof(* rowchange)通常比sizeof(type-name)更可取,只是为了稍微放松耦合。它减少了检查代码复查的工作量,并使意图更加明显。
通常,您在这里提出问题时,应该对可以运行的东西进行C + P操作,而不必添加一吨脚手架。