gpt4 book ai didi

C:动态分配时通过引用传递

转载 作者:行者123 更新时间:2023-11-30 16:13:48 24 4
gpt4 key购买 nike

我的代码是分配和初始化数组,如下(floatalloc2是用于分配二维数组的函数):

#include <stdio.h>
#include <stdlib.h>

void alloc_arr(int adjwfd, int nx, int nz, float **G, float **L1, float **L2)
{
G = floatalloc2(nx, nz);
switch (adjwfd){
case 1:
L1 = floatalloc2(nx, nz);
break;
case 2:
L2 = floatalloc2(nx, nz);
break;
}
}

void init_arr(int adjwfd, int nx, int nz, float **G, float **L1, float **L2)
{
memset(G[0],0,nx*nz*sizeof(float));
switch (adjwfd){
case 1:
memset(L1[0],0,nx*nz*sizeof(float));
break;
case 2:
memset(L2[0],0,nx*nz*sizeof(float));
break;
}
}


int main(int argc, char *argv[])
{

int adjwfd_P=1, nx=10, nz=10;
float **glob=NULL, **local1=NULL, **local2=NULL;

alloc_arr(adjwfd_P, nx, nz, glob, local1, local2);
init_arr(adjwfd_P, nx, nz, glob, local1, local2);

exit(0);
}

编译通过。但是当我运行这段代码时,它出错了:

YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11)

但是,我发现如果我按如下方式更改alloc_arr,它就会成功运行:

#include <stdio.h>
#include <stdlib.h>

void alloc_arr(int adjwfd, int nx, int nz, float ***G, float ***L1, float ***L2)
{
*G = floatalloc2(nx, nz);
switch (adjwfd){
case 1:
*L1 = floatalloc2(nx, nz);
break;
case 2:
*L2 = floatalloc2(nx, nz);
break;
}
}

void init_arr(int adjwfd, int nx, int nz, float **G, float **L1, float **L2)
{
memset(G[0],0,nx*nz*sizeof(float));
switch (adjwfd){
case 1:
memset(L1[0],0,nx*nz*sizeof(float));
break;
case 2:
memset(L2[0],0,nx*nz*sizeof(float));
break;
}
}


int main(int argc, char *argv[])
{

int adjwfd_P=1, nx=10, nz=10;
float **glob=NULL, **local1=NULL, **local2=NULL;

alloc_arr(adjwfd_P, nx, nz, &glob, &local1, &local2);
init_arr(adjwfd_P, nx, nz, glob, local1, local2);

exit(0);
}

我的问题是为什么我必须获取 2D 数组的地址,并在 alloc_arr 中仅为分配部分定义 3D 数组,而在其他函数(例如 init_arr)中code>,我可以将原始的二维数组传递到函数中吗?

最佳答案

why I have to take the address of the 2D array, and in the alloc_arr define 3D array only for the allocation part,......

在这种情况下:

alloc_arr(adjwfd_P, nx, nz, glob, local1, local2);

您实际上将最后三个参数传递为 NULLalloc_arr()功能参数G , L1L2作为glob , local1local2初始化为 NULL并在 alloc_arr()

void alloc_arr(int adjwfd, int nx, int nz, float **G, float **L1, float **L2)
{
G = floatalloc2(nx, nz);
.....
L1 = floatalloc2(nx, nz);
.....
L2 = floatalloc2(nx, nz);
.....

内存被分配给 G , L1L2这是 alloc_arr()局部变量功能。在 main()glob , local1local2 alloc_arr() 之后仍然是空指针函数返回。这些空指针传递给 init_arr()当尝试在 init_arr() 中访问它们时您的程序出现段错误。

在本例中

alloc_arr(adjwfd_P, nx, nz, &glob, &local1, &local2);

您正在传递指针的地址glob , local1local2作为 alloc_arr() 的参数功能参数G , L1L2 ,这意味着 G , L1L2将保存地址 glob , local1local2分别指点。

void alloc_arr(int adjwfd, int nx, int nz, float ***G, float ***L1, float ***L2)
{
*G = floatalloc2(nx, nz);
.....
*L1 = floatalloc2(nx, nz);
.....
*L2 = floatalloc2(nx, nz);
.....

取消引用指针G将给出 glob指针即 *Gglob 。同样,取消引用 *L1*L2将给出指针 local1local2分别。所以,当分配内存到*G时, *L1*L2实际上会将内存分配给 glob , local1local2指针。

whereas in other functions such as init_arr, I can just pass the original 2D array into the function?

看看这个:

alloc_arr(adjwfd_P, nx, nz, &glob, &local1, &local2);
init_arr(adjwfd_P, nx, nz, glob, local1, local2);

alloc_arr()将分配内存给 glob , local1local2这意味着从 alloc_arr() 返回后(假设一切按预期工作)指针 glob , local1local2指向有效的内存位置。在 init_arr()您只是将这些内存位置作为参数传递给 init_arr()功能参数G , L1L2 。在 init_arr() ,访问G , L1L2意味着它正在访问这些内存位置。

<小时/>

附加:

遵循良好的编程习惯,确保在程序退出之前释放分配的内存。

关于C:动态分配时通过引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57912873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com