2013-10-29 38 views
1

我得到錯誤「可能未初始化本地指針變量‘ptrNames’用」如果我運行此代碼:#ERROR#潛在的未初始化本地指針變量「ptrNames」使用

void processHits (GLint hits, GLuint buffer[]) //Some prints 
{ 
    unsigned int i, j; 
    GLuint names, *ptr, minZ,*ptrNames, numberOfNames; 
    if (hits == 0) 
     noSelected = true; 
    else 
     noSelected = false; 
    ptr = (GLuint *) buffer; 
    minZ = 0xffffffff; 
    for (i = 0; i < hits; i++) { 
     names = *ptr; 
     ptr++; 
     if (*ptr < minZ) { 
      numberOfNames = names;             
      minZ = *ptr; 
      ptrNames = ptr+2; 
     } 
     ptr += names+2; 
    } 
    ptr = ptrNames; //Error at this line! 
    for (j = 0; j < numberOfNames; j++,ptr++) { 
     if (hits > 0) 
      LastSelected = *ptr; 
    } 
} 
+5

顯示至少*一些*努力。錯誤信息的哪部分你不明白? –

+0

http://stackoverflow.com/questions/10284782/potentially-uninitialized-local-variable-used-why – UpAndAdam

回答

9

的錯誤是正確的。 ptrNames僅在測試if (*ptr < minZ)成功時才被初始化。

最簡單的修復方法是將ptrNames初始化爲NULL,然後在第一個for循環之後檢查其值,如果尚未更新,則返回(因爲沒有命中處理)。

void processHits (GLint hits, GLuint buffer[]) //Some prints 
{ 
    unsigned int i, j; 
    GLuint names, *ptr, minZ,*ptrNames=NULL, numberOfNames; 
    ... 
    if (ptrNames == NULL) 
     return; 
    ptr = ptrNames; 
    ... 
} 
+2

可能出現的情況在後一種情況下,當分配發生時'ptrNames'仍然未初始化。它位於for循環之外,由於格式不正確,可能不容易看到它。 –

+0

@ArneMertz謝謝。我已經更新了問題中的格式以使其更清楚。我會在一秒內更新我的答案... – simonc

+0

Thx,現在它可以工作! – float

1

您需要將您的ptrNames變量初始化爲某物。 if (*ptr < minZ)可能會阻止ptrNames被設置爲某些東西,因此您將會看到指向某處的指針,這些指向您不知道的地方並且可能會破壞所有內容。