2011-05-22 241 views
1

这里是我的代码:未初始化的局部变量!

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他们主要?帮帮我!

+1

é欢迎SO!你可能并不知道我们通常在这里做的三件事:1)当你得到帮助时,尝试给予它**在你的专业领域回答问题** 2)['阅读常见问题](http:// tinyurl.com/2vycnvr)3)当你看到好的Q&A时,用[灰色三角形](http://i.imgur.com/kygEP.png)对它们进行投票,因为系统的可信度基于通过分享知识获得用户的声誉。还请记住接受更好地解决您的问题的答案,如果有的话,[按'checkmark sign'](http://tinyurl.com/4srwe2t) – 2011-05-22 21:16:20

回答

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); 
1
Coords** latLng; 
//... 
latLng[0] = AdicionaValores(latLng[0],-23.000490,-43.346687); 
latLng[1] = AdicionaValores(latLng[1],-22.988243,-43.342224); 

在这里你声明的指针指向Coords结构(S),但是你继续取消引用接下来的两行未初始化的指针。此时,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

你可以声明:

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)); 
    .... 
} 

然后只是不要将第一个参数传递给他们在主要。