传递了指向函数的指针,但该函数似乎无法对其进行更改

时间:2019-10-28 03:29:58

标签: c

编辑:解决方案是将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一样。我该怎么办?

1 个答案:

答案 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(...);)。