成功初始化后,结构成员被垃圾价值覆盖

struct member gets overwritten by garbage value after successful initialization

本文关键字:覆盖 成员 初始化 结构 成功      更新时间:2023-10-16

我已经在此功能上进行了相当长的一段时间,无法将我的头缠绕在此代码中可能发生的事情。

    void make_points(DocSpec instance, Tree *myTree, Point *p){
int i, j, k, index = 0;
for(i = 0; i < instance.numPt; i++)
    {
        p[i].x = instance.xCoordinates[i];
        p[i].y = instance.yCoordinates[i];
        p[i].parent = myTree[i].parent;
        p[i].num_children = 0;
        for(k = 0; k < MAX_NUM_CHILDREN; k++)
            {
                p[i].child[k] = 0;
            }
        for(j = 0; j < instance.numPt; j++)
            {
                if((i != j) && (myTree[j].parent == i))
                    {
                        p[i].num_children++;
                        p[i].child[index] = j;
                        index++;
                    }
            }
         p[i].overlap_hv = -1;
         p[i].overlap_vh = -1;
         index = 0;
     }
printf("p[1].index = %d;n", p[1].index);
printf("p[1].x = %d;n", p[1].x);
printf("p[1].y = %d;n", p[1].y);
printf("p[1].parent = %d;n", p[1].parent);
printf("p[1].num_children = %d;n", p[1].num_children);
printf("p[1].child[8] = {");
index = 0;
for(i = 0; i < MAX_NUM_CHILDREN; i++)
    {
        if(p[1].child[i] != 0 && index == 0)
            {
                printf("%d", p[1].child[i]);
            }
        elseif(p[1].child[i] != 0)
            printf(", %d", p[1].child[i]);
    }
print("};n");
printf("p[1].overlap_hv = %d;n", p[1].overlap_hv);
printf("p[1].overlap_vh = %d;n", p[1].overlap_vh);
}

运行该功能后我将获得的输出如下:

p[1].index = 1;
p[1].x = 0;
p[1].y = 90;
p[1].parent = 5;
p[1].num_children = 0;
p[1].child[8] = {1563515760, 1768448814, 945513580, 540876893};
p[1].overlap_hv = 909455739;
p[1].overlap_vh = 892679225;

,但应该是:

p[1].index = 1;
p[1].x = 0;
p[1].y = 90;
p[1].parent = 5;
p[1].num_children = 0;
p[1].child[8] = {};
p[1].overlap_hv = -1;
p[1].overlap_vh = -1;

当我在程序上运行GDB时,我注意到P [1]的值适当初始化,但是当

>
printf("p[1].x = %d;n", p[1].x);

被执行-p [1] .Child [4],P [1] .Child [5],P [1] .Child [6],P [1] .Child [7],P [1].overlap_hv,p [1] .overlap_vh都被垃圾值覆盖。

我不知道printf语句为什么或如何更改我的结构成员的值。

任何帮助将不胜感激。

事实证明,我在重新定位内存时没有使用正确的打字。与Valgrind进行快速检查,将我直接造成罪魁祸首。

p = (Point*) realloc(p, instance.numPt * sizeof(p));

这修复了

p = (Point*) realloc(p, instance.numPt * sizeof(Point));

感谢所有建议。

我的猜测是index正在越过儿童边界,j覆盖下一个结构成员p[1].overlap_hvp[1].overlap_vh

                    p[i].child[index] = j;
                    index++;