在main函数中,我只声明了双指针变量,并按如下所示分配了二维矩阵。
int main(){
double **XNODE;
XNODE = (double**)calloc(2,sizeof(double*));
for(int i=0; i<2; i++){
XNODE[i] = (double*)calloc(3,sizeof(double));
}
XNODE[0][0] = 1.0; XNODE[0][1] = -1.0; XNODE[0][2] = -122.0;
XNODE[1][0] = 2.0; XNODE[1][1] = 3.0; XNODE[1][2] = -4.0;
test(*XNODE);
return 0;
然后将XNODE变量放入下面的“test”函数中
void test(double*XNODE)
{
for(int i=0; i<2; i++){
for(int j=0; j<3; j++){
printf("%e ", *(XNODE+3*i+j));
}
}
我的期望是1 -1 -122 2 3 -4
但输出如下1 -1 -122 1. 63 e-322 2 3
我该如何解决这个问题??
2条答案
按热度按时间a9wyjsp71#
test(*XNODE);
传递保存在XNODE[0]
中的指针。该指针的值来自(i==0)
和XNODE[i] = (double*)calloc(3,sizeof(double));
时的分配。该分配具有3double
的内存。test()
尝试打印6个相邻的double
。前3个与预期一致。其余的在分配之外,因此 * 未定义行为 *(UB)。我该如何解决这个问题??
test()
重写为test(int rows, int cols, double **d)
。test()
主体以使用rows, cols, d
。test(2, 3, XNODE)
。w46czmvw2#
函数
*(XNODE+3*i+j)
中的代码期望能够计算任何数组元素的位置,作为相对于基指针XNODE
的偏移量。为此,所有数组元素必须在数组开始后连续地位于内存中。main
中的分配不这样做。循环为每一行单独分配内存,所以每一行都在calloc
例程放置它的地方。它们不太可能在内存中连续。若要正确分配内存,必须在一次分配中为数组元素分配所有内存。计算该内存量,分配它,并将指向该内存的指针传递给
test
。可以使用double *XNode = calloc(2 * 3 * sizeof *XNode);
执行此操作。要访问该内存,可以使用与
test
中的代码相同的方法:行i
列j
中的元素是*(XNode + 3*i + j)
,也可以写成XNode[3*i + j]
。