3

如果我运行以下代码,我会收到错误“可能使用了未初始化的本地指针变量'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;
    }
}
4

2 回答 2

14

错误是正确的。 ptrNames仅在测试if (*ptr < minZ)成功时才初始化。

最简单的修复可能是初始化ptrNamesNULL然后在第一个循环之后检查其值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;
    ...
}
于 2013-10-29T16:49:08.260 回答
1

您需要将ptrNames变量初始化为某些东西。if (*ptr < minZ)可能会阻止将其ptrNames设置为某些内容,因此您将指针指向您不知道的地方并可能破坏一切。

于 2013-10-29T16:50:34.220 回答