未初始化的局部变量!

时间:2011-05-22 19:57:55

标签: c variables malloc struct initialization

这是我的代码:

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他们在主?帮助!

3 个答案:

答案 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)

latLngq1确实未初始化。

Coords** latLng;
latLng[0] = …

您从未向latLng分配任何内容,但您尝试将其视为指向要放置值的数组的指针。您不仅需要将latLng初始化为有效指针,还需要为该数组分配内存。由于这是一个具有固定大小(2)的数组,它不需要持续超出函数的生命周期,因此可以在堆栈上分配它。

Coords* latLng[2];
latLng[0] = …

在更改之后,您仍然会收到有关未初始化变量的警告,但这是由于AdicionaValoresAdicionaValoresQuadrado的界面出现问题。这些函数实际上从不使用它们的第一个参数,但它们需要一个,并且您传递的是完全任意的值。只需删除第一个参数,并将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);