2011-05-22 162 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)); 
    .... 
} 

然後只是不要將第一個參數傳遞給他們在主要。