这是我的代码:
int main(void)
{
int i;
Coords** latLng;
Quadrado* q1;
latLng[0] = AdicionaValores(latLng[0],-23.000490,-43.346687);
latLng[1] = AdicionaValores(latLng[1],-22.988243,-43.342224);
q1 = AdicionaValoresQuadrado(q1,-23.000490,-43.346687,-22.988243,-43.342224);
printf("# Connecting to database.\n");
for(i=0;i<2;i++)
{
if(clientInside(q1, latLng[i]))
printf("Dentro");
else
printf("Fora");
}
system("PAUSE");
}
这是AdicionaValores和AdicionaValoresQuadrado:
Coords* AdicionaValores(Coords* v, double x, double y)
{
v = (Coords*) malloc(sizeof(Coords));
v->x = x;
v->y = y;
return v;
}
Quadrado* AdicionaValoresQuadrado(Quadrado* q, double x1, double y1, double x2, double y2)
{
q = (Quadrado*) malloc(sizeof(Quadrado));
q->x1 = x1;
q->x2 = x2;
q->y1 = y1;
q->y2 = y2;
return q;
}
它编译好2个警告,告诉我latLng和q1未初始化!我该怎么办 ?? malloc他们在主?帮助!
答案 0 :(得分:2)
您可以声明:
Coords *latLng[2];
对于问题“latLng”未初始化,或在main
中对其进行malloc。
对于其他人 - 函数没有理由将指针作为第一个参数,因为它没有对原始值做任何事情。所以:
Coords* AdicionaValores(double x, double y)
{
Coords* v = (Coords*) malloc(sizeof(Coords));
....
}
Quadrado* AdicionaValoresQuadrado(double x1, double y1, double x2, double y2)
{
Quadrado* q = (Quadrado*) malloc(sizeof(Quadrado));
....
}
然后就是不要在main中将第一个参数传递给他们。
答案 1 :(得分:1)
Coords** latLng;
//...
latLng[0] = AdicionaValores(latLng[0],-23.000490,-43.346687);
latLng[1] = AdicionaValores(latLng[1],-22.988243,-43.342224);
在这里,您声明一个指向Coords
结构的指针的指针,但是您继续在下两行中取消引用未初始化的指针。此时,latLng
不是有效指针,可能具有任何值。
您正在调用未定义的行为。在根据它将指向的子元素(指向latLng
的指针)的数量取消引用之前,需要初始化Coord
。然后,您可以继续初始化子元素,如下所示:
Coords* latLng[2];
//...
latLng[0] = // some assignment
latLng[1] = // some assignment
您可能尚未意识到的另一个问题是您的malloc
不会影响您传递到AdicionaValores
函数的指针的值。您正在按值传递指针。如果要为原始指针指定一个新值,则需要传入指向它的指针,即
private Coords* AdicionaValores( Coords** q, double x, double y )
{
*v = (Coords*) malloc(sizeof(Coords));
}
这似乎有效,因为你只是返回指针。您根本不需要使用第一个参数,因为它从未使用过。只需省略它并返回一个新指针。
答案 2 :(得分:0)
latLng
和q1
确实未初始化。
Coords** latLng;
latLng[0] = …
您从未向latLng
分配任何内容,但您尝试将其视为指向要放置值的数组的指针。您不仅需要将latLng
初始化为有效指针,还需要为该数组分配内存。由于这是一个具有固定大小(2)的数组,它不需要持续超出函数的生命周期,因此可以在堆栈上分配它。
Coords* latLng[2];
latLng[0] = …
在更改之后,您仍然会收到有关未初始化变量的警告,但这是由于AdicionaValores
和AdicionaValoresQuadrado
的界面出现问题。这些函数实际上从不使用它们的第一个参数,但它们需要一个,并且您传递的是完全任意的值。只需删除第一个参数,并将v
声明为局部变量。
Coords* AdicionaValores(double x, double y)
{
Coords *v = malloc(sizeof(Coords));
v->x = x;
v->y = y;
return v;
}
(请注意,您不需要转换malloc
的返回值,除非您有理由并且了解原因,否则不应使用强制转换。在生产程序中,您应该检查是否malloc
内存不足,但现在还可以。)然后在main
:
Coords* latLng[2];
Quadrado* q1;
latLng[0] = AdicionaValores(-23.000490,-43.346687);
latLng[1] = AdicionaValores(-22.988243,-43.342224);
q1 = AdicionaValoresQuadrado(-23.000490,-43.346687,-22.988243,-43.342224);