gpt4 book ai didi

c - 传递了指向函数的指针,但该函数似乎无法更改它

转载 作者:行者123 更新时间:2023-11-30 18:44:15 25 4
gpt4 key购买 nike

编辑:解决方案是将 mainMap 声明为 int **mainMap;

然后在调用track_heatmap时传递&mainMap

最后,在 track_heatmap 中执行 *map = rowArray;

感谢所有提供帮助的人以及我学校的一位校友伸出援手

track.c:包含

void track_heatmap(const track *trk, double cell_width, double cell_height,
int ***map, int *rows, int *cols)

参数图:即您传入一个指针,该指针接收数据。因此要进行设置,请在track_heatmap 我有这段代码,它只是创建一个映射(malloc 的二维整数数组),然后指定“map”参数指向该数组。

(track_heatmap函数内部的代码):

if( (nRows >= 0) && (nColumns >= 0) )
{
// Create the 2D Array:
int **rowArray = malloc(sizeof(int*) * nRows);
for(int i=0; i<nRows; i++)
{
rowArray[i] = malloc(sizeof(int) * nColumns);
}


// Step through & initialize every int value in the 2D Array:

for(int i=0; i<nRows; i++)
{
for(int j=0; j<nColumns; j++)
{
rowArray[i][j] = 0;
// int curCell = rowArray[i][j];
}
}

map = &rowArray;

现在在我的主函数中,在一个名为 Heatmap.c 的文件中,我实际上使用了它。热图.c

int ***mainMap = malloc(sizeof(int**));
track_heatmap(mainTrack, argWidth, argHeight, mainMap, mainRows, mainCols);

据我了解,由于我们将 mainMap 作为“map”参数传递,并且track_heatmap 将 &RowArray 指定为“map”,然后 mainMap 现在应该指向同一个二维数组。但是,当尝试访问 *mainMap[0][0] 时,出现以下错误:

==30007== Invalid read of size 8
==30007== at 0x4014C4: main (Heatmap.c:120)
==30007== Address 0x0 is not stack'd, malloc'd or (recently) free'd

这就好像 mainMap 没有被 track_heatmap 改变一样。我该怎么办?

最佳答案

更改函数变量的值(包括声明为参数的变量)对调用者没有影响。

void bad1(int i) {
i = 1; // No effect on the caller.
}

void bad2(void* p) {
p = NULL; // No effect on the caller.
}

如果您想更改调用者中的变量,则需要传递一个指向它的指针。

void good1(int* i_ptr) {
*i_ptr = 1;
}

void good2(void** p_ptr) {
*p_ptr = NULL;
}

如果要修改 mainMap,则需要向其传递一个指针 (&mainMap) 并修改指向的值 (*ptr = . ...;).

或者,您可以简单地返回指针 (mainMap = track_heatmap(...);)。

关于c - 传递了指向函数的指针,但该函数似乎无法更改它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58585478/

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