2013-10-30 84 views
2

發生奇怪的事情,我實現了這個功能來創建部門d,並與分支因子B樹:與動態分配的內存

void create(node *n, int b, int d){ 
int cont,i; 


if(d>0){ 
    n->children = (node *) malloc(b*sizeof(node)); 

    if(!n->children){ 
     printf("\n\nMemory couldn't be allocated\n"); 
     getchar(); 
     return; 
    } 
    n->alpha = -100; 

    for(i=0;i<b;i++){ 
     create((n->children+i*sizeof(node)), b, d-1); 

    } 
} 
else if(d==0){ 
    if(n){ 
     n->alpha = rand()%9 + 1; 
     printf("%d ",n->alpha); 
    } 

} 

它工作正常的d < 6和B < 6,但是當b = 6和d = 6,或更大,它給了我一個分段錯誤。

但是,當我改變行創建((n->兒童+ i * sizeof(節點)),b,d-1); ((& n-> children [i]),b,d-1);,它對任何d和b都是完美的,就我所測試的那樣。但是這兩條線確實是一樣的!只是兒童結構的地址....所以,有人知道爲什麼會發生? malloc是否分配一個連續的內存塊?

這件事真的讓我感到困惑!請幫助!

感謝=),

英格麗

+3

'n-> children + i'等價於'&n-> children [i]'。只需刪除* sizeof – SHR

+0

http://ideone.com/uPwIG7正如您在這裏看到的,指針算術已經清楚地計算了 – Rerito

+1

@SHR中的對象大小。我正打算把它打出來,但是發佈後我就會投票並繼續前進。 – WhozCraig

回答

1

你回答你的問題。 :d

但是,當我更改行創建((N->兒童+ I *的sizeof(節點))中,b, d-1); ((& n-> children [i]),b,d-1);對於任何d和b,它都可以完美地工作 ,就我所測試的而言。但兩條線 真的是一樣的!只是孩子們的地址STRUCT

的兩行是NOT一樣的指針算法考慮到了對象的類型,它正確地與該對象類型的大小adjustes結果地址。 所以:

n->children+i === &n->children[i] 

都得到轉化爲(n->children)+ (i * sizeof(struct node)) 同時,你的代碼:

(n->children+i*sizeof(node) 

得到轉化爲(n->children)+ (i * sizeof(struct node))*sizeof(struct node)。 第一個sizeof運算符是由您添加錯誤添加的,而第二個sizeof運算符是由指針算術自動添加的。

它工作正常的d < 6和B < 6,但是當b = 6,d = 6,或者更大,它​​ 給了我分割故障。

它的工作量很小,因爲malloc函數在進程空間中映射的內存比性能方面的要多。當您超出正確映射的內存區域時,您會遇到分段錯誤。

不是malloc分配一個連續的內存塊嗎?

是的,malloc分配連續存儲器塊。

+1

非常感謝! = d – igalvez