编辑:解决方案是将mainMap声明为int ** mainMap;
然后在调用track_heatmap pass&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分配的2D整数数组),然后指定“ 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的文件中,我实际上使用了它。 Heatmap.c
int ***mainMap = malloc(sizeof(int**));
track_heatmap(mainTrack, argWidth, argHeight, mainMap, mainRows, mainCols);
据我了解,由于我们将mainMap传递为“ map”参数,并且 track_heatmap将&RowArray分配为“ map”,然后mainMap现在应POINT到 相同的2D数组。但是,当尝试访问* 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
就好像track_heatmap尚未更改mainMap一样。我该怎么办?
答案 0 :(得分:2)
更改函数变量的值(包括声明为参数的变量)对调用方没有影响。
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(...);
)。