C 指针设置为地址,但莫名其妙地指出了程序的不同部分中的不同值

C++ pointer set to address, but inexplicably points to different values in different parts of program

本文关键字:程序 同部 设置 指针 地址 莫名其妙      更新时间:2023-10-16

我正在尝试使用指针toRender在我的射线播放程序中存储最接近三角形的地址。我的第一个打印语句表明它正在工作:打印1,这是最接近三角形的toRender->color.x的正确值。但是,一旦程序进入下一个打印语句,它将为toRender->color.x打印0。这是另一个三角形的颜色值,但重要的是,该像素并未相交的三角形(外部循环的迭代(,第一个cout并未打印为该像素的0。当我调试代码时,尽管toRender->color.x在两个打印语句上给出了不同的值,但分配给toRender的地址保持不变。我不知道该如何考虑。

我不确定它是否相关,但是world是一个函数参数:const std::vector<Triangle>& worldTriangle是struct。

        float minDist = 1000; // distance to closest sphere
        Triangle* toRender;
        // check for intersection with each triangle in the world
        for (Triangle triangle : world) {
            // distance to triangle
            double distTo;
            // distTo is set in intersectTriangle
            if(intersectTriangle(ray, triangle, distTo)){
                // set new minDist if closest
                if (distTo < minDist){
                    minDist = distTo;
                    toRender = &triangle;
                    cout << toRender->color.x << endl;
                }
            }
        }

        // don't render anything farther than 1000 away
        if(minDist < 1000) {
            cout << toRender->color.x << endl;
            // get color from closest shape
            double red = toRender->color.x * 255;
            double green = toRender->color.y * 255;
            double blue = toRender->color.z * 255;
            // set color
            color = make_colour(red, green, blue);
        }

triangle是包含容器中对象的 copy 的变量,该变量范围为循环。它不存在在循环外部,因此您分配给toRender的指针指向循环后的一个破坏对象。那是不确定的行为。

如果您打算使用triangle参考中的对象 中的对象而不是为一个副本,则将其作为参考(auto& triangle : ...