void matrixSetSize(double ***pMatrix, int size) {
if (*pMatrix == NULL) { // void matrix
*pMatrix = (double**)malloc(size * sizeof(double*));
for (int i = 0; i < size; i++)
*(*pMatrix + i) = (double*)malloc(size * sizeof(double));
}
else { // resize existing matrix
double **pointer = (double**)realloc(*pMatrix, 2 * size * sizeof(double*));
for(int i = 0; i < size; i++)
pointer[i] = (double*)realloc(*(pMatrix+i), 2 * size * sizeof(double));
for (int i = size; i < 2 * size; i++)
pointer[i] = (double*)malloc(size * sizeof(double));
for(int i = 0; i < size; i++)
free(*(*pMatrix + i));
free(*pMatrix);
*pMatrix = pointer;
}
}
问题:当我尝试重新分配矩阵的大小时,代码将无法工作,我也不知道为什么。有人可以向我解释为什么不起作用吗?
答案 0 :(得分:2)
这不能解决您发布的代码的问题,但也许可以帮助您获得更大的前景:
double (*matrix)[size] = malloc(initial_size * initial_size * sizeof(double));
matrix[0][0] = 42;
matrix[size-1][size-1] = 24;
/* resizing */
double (*new_mat)[new_size] = realloc(matrix, new_size*new_size*sizeof(double));
matrix[0][0] = 42;
matrix[new_size-1][new_size-1] = 24;
/* freeing */
free(new_mat);
不是更简单吗? 而且分配/释放的速度快得多,因为它只是一种分配。 而且使用起来非常快,因为:
请,当您需要2D数组时,请制作2D数组,而不是N-1D数组的1D数组到指针。
两个警告:1)如果要在调整大小时保留旧数据,则需要手动移动它; 2)编译器必须支持C99。
答案 1 :(得分:1)
两个问题:
从重新分配代码中考虑以下几行:
pointer[i] = (double*)realloc(*(pMatrix+i), 2 * size * sizeof(double));
pointer[i] = (double*)malloc(size * sizeof(double));
第二秒,您分配的内存不如重新分配。
重新分配后,您可以释放旧数据,但是已经通过realloc
调用完成了。
在不相关的音符上,用C表示should not cast the result of malloc
(or it siblings)。