【发布时间】:2020-06-11 09:17:53
【问题描述】:
我正在开发一个“轻型无人机模拟器”(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”。为什么不初始化呢?初始化变量(所有变量,尤其是那些在首次写入之前可能或保证使用的变量)通常是一个好主意。
-
realloc将无法使用未初始化的指针。将其设置为NULL。 -
@Yunnosch 我的目标是在我第一次使用“左键单击”功能时对其进行初始化,因为我可能根本不需要它。
-
每次离开函数时,
TargetsArray的值都会被丢弃。是函数参数,分配的指针不是函数返回的值。 -
你怎么看?函数参数
double ** TargetsArray被TargetsArray = malloc( sizeof *TargetsArray );覆盖