C语言函数中的双指针变量

d6kp6zgx  于 2022-12-29  发布在  其他
关注(0)|答案(2)|浏览(163)

在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
我该如何解决这个问题??

a9wyjsp7

a9wyjsp71#

test(*XNODE);传递保存在XNODE[0]中的指针。该指针的值来自(i==0)XNODE[i] = (double*)calloc(3,sizeof(double));时的分配。该分配具有3 double的内存。
test()尝试打印6个相邻的double。前3个与预期一致。其余的在分配之外,因此 * 未定义行为 *(UB)。
我该如何解决这个问题??

  • test()重写为test(int rows, int cols, double **d)
  • 重写test()主体以使用rows, cols, d
  • 通过test(2, 3, XNODE)
w46czmvw

w46czmvw2#

函数*(XNODE+3*i+j)中的代码期望能够计算任何数组元素的位置,作为相对于基指针XNODE的偏移量。为此,所有数组元素必须在数组开始后连续地位于内存中。
main中的分配不这样做。循环为每一行单独分配内存,所以每一行都在calloc例程放置它的地方。它们不太可能在内存中连续。
若要正确分配内存,必须在一次分配中为数组元素分配所有内存。计算该内存量,分配它,并将指向该内存的指针传递给test。可以使用double *XNode = calloc(2 * 3 * sizeof *XNode);执行此操作。
要访问该内存,可以使用与test中的代码相同的方法:行ij中的元素是*(XNode + 3*i + j),也可以写成XNode[3*i + j]

相关问题