2017-12-02 297 views
0

我一直在調試這個函數很長一段時間了,無法用這段代碼包裹我的頭。成功初始化後,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語句可以更改我的結構成員的值。

任何幫助將不勝感激。

+1

爲什麼你使用C和C++標籤?選一個。 – 2017-12-02 23:49:11

+0

瘋狂的猜測是代碼在某處寫出了界限。 「Point」看起來像什麼,分配點和子女的空間又是多少? –

+0

由於代碼不完整,很難重現錯誤。我可以猜測'p'不是指向數組的第一個元素的指針,而是指向單個'Point',並且'p [1]'不存在並指向一些隨機垃圾內存。但這只是一個猜測,因爲我看不到代碼。 – nwp

回答

0

我的猜測是,index是過路的孩子邊界和j覆蓋下一個結構成員p[1].overlap_hvp[1].overlap_vh

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

原來重新分配內存時,我沒有使用正確的類型轉換。與Valgrind的快速檢查讓我立即找到了罪魁禍首。

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

,這是固定

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

感謝所有的建議。