我一直在調試這個函數很長一段時間了,無法用這段代碼包裹我的頭。成功初始化後,struct成員被垃圾值覆蓋
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語句可以更改我的結構成員的值。
任何幫助將不勝感激。
爲什麼你使用C和C++標籤?選一個。 – 2017-12-02 23:49:11
瘋狂的猜測是代碼在某處寫出了界限。 「Point」看起來像什麼,分配點和子女的空間又是多少? –
由於代碼不完整,很難重現錯誤。我可以猜測'p'不是指向數組的第一個元素的指針,而是指向單個'Point',並且'p [1]'不存在並指向一些隨機垃圾內存。但這只是一個猜測,因爲我看不到代碼。 – nwp