我正在使用“轻型无人机模拟器”(用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)
我知道这样做的方法比较简单,但是我真的很想了解为什么这行不通。我很确定这是由于我使用malloc和realloc的方式造成的,但是我也不明白为什么在第一个“循环”中程序不会进入if语句,而不会打印“ 0”,然后为什么要在打印计数器(cnt)之前打印“ Hello”?
我希望我能给您足够的代码来理解我的问题,但是如果有什么遗漏,请告诉我。
谢谢!
关于malloc和realloc的行,请检查您要求的内存是否可用并且可以分配,如果出错,都返回NULL
。
仅检查两个分配调用是否有足够的内存,是否可以分配,如下所示:
您需要更改函数的参数TargetsArray
,使其指向全局变量,而不仅存储相同的值。