在未初始化的指针上使用Malloc / Realloc时出现SegFault

问题描述 投票:0回答:2

我正在使用“轻型无人机模拟器”(用C语言编写),我的任务之一是在地图上单击鼠标左键时添加一个静态目标。到目前为止,一切都很好。事实是,与其创建一个具有给定大小的矩阵作为全局变量,我不希望从未初始化的指针开始,并且在我单击鼠标左键后,我重新分配新的内存,以便始终有足够的可用内存,但没有更多空间。另外,我的“矩阵”应该有4列用于3D坐标,有1列用于“激活”。

这是我的代码的一部分:

/* Main program */

double **TargetsArray;

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

/* Call of model-specific mouse handling function */
   HandleSpecialMouseEvent(button, state, x, y, &ActualFlockingParams,
            &ActualVizParams, TargetPosition, TargetsArray, Modder);
}
void HandleSpecialMouseEvent(int button,
        int state,
        int x,
        int y,
        flocking_model_params_t * FlockingParams,
        vizmode_params_t * VizParams, 
        double * CoordTarg, double ** TargetsArray,
        const int Modifier) {

       static int cnt = 0;

       if (button == GLUT_LEFT && state == GLUT_DOWN && Modifier == GLUT_ACTIVE_ALT) {
            FillVect(CoordTarg, MouseCoordToReal_2D(x, VizParams->MapSizeXY,
                    VizParams->Resolution) + VizParams->CenterX, -MouseCoordToReal_2D(y, VizParams->MapSizeXY,
                    VizParams->Resolution) + VizParams->CenterY, 0);
            printf("%d\n", cnt);

            if (cnt == 0) {

                TargetsArray = malloc( sizeof *TargetsArray );
                TargetsArray[cnt] = malloc( sizeof **TargetsArray * 4);
                printf("Hello");
                TargetsArray[cnt][0] = CoordTarg[0];
                TargetsArray[cnt][1] = CoordTarg[1];
                TargetsArray[cnt][2] = 0;
                TargetsArray[cnt][3] = 1;

                cnt += 1;
            }
            else {
                printf("Youhou");
                TargetsArray = realloc(TargetsArray, sizeof *TargetsArray * (cnt + 1) );
                TargetsArray[cnt] = malloc( sizeof **TargetsArray * 4);
                TargetsArray[cnt][0] = CoordTarg[0];
                TargetsArray[cnt][1] = CoordTarg[1];
                TargetsArray[cnt][2] = 0;
                TargetsArray[cnt][3] = 1;
                TargetsArray[cnt - 1][3] = 0;

                cnt += 1;

            }

            // for (int j = 0; j < cnt; j++) {
            //     for (int i = 0; i < 4; i++) {
            //         printf("%f\t", TargetsArray[j][i]);
            //     }
            //     printf("\n");
            // }
        }


}

我通常会遇到两种类型的错误:

0
Hello1
Youhou2
Erreur de segmentation (core dumped)

OR 

0
Hello1
free(): invalid next size (fast)
Abandon (core dumped)

我知道这样做的方法比较简单,但是我真的很想了解为什么这行不通。我很确定这是由于我使用mallocrealloc的方式造成的,但是我也不明白为什么在第一个“循环”中程序不会进入if语句,而不会打印“ 0”,然后为什么要在打印计数器(cnt)之前打印“ Hello”?

我希望我能给您足够的代码来理解我的问题,但是如果有什么遗漏,请告诉我。

谢谢!

c pointers malloc realloc
2个回答
0
投票

关于malloc和realloc的行,请检查您要求的内存是否可用并且可以分配,如果出错,都返回NULL

仅检查两个分配调用是否有足够的内存,是否可以分配,如下所示:


0
投票

您需要更改函数的参数TargetsArray,使其指向全局变量,而不仅存储相同的值。

© www.soinside.com 2019 - 2024. All rights reserved.