我实现了这个函数来创建一个dept 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或更大时,它会给我一个分段错误。
但是,当我更改创建((&amp;)行创建((n->儿童+ i * sizeof(节点)),b,d-1); 行时; n-&gt; children [i]),b,d-1); ,就我测试的任何d和b而言,它都能很好地工作。但这两条线真的是一样的!只是孩子结构的地址....所以,有人知道它为什么会发生吗? malloc不分配一个连续的内存块吗?
这件事让我很困惑!!请帮忙!谢谢=),
英格丽
答案 0 :(得分:1)
但是当我更改行创建((n-> children + i * sizeof(node))时,b, d-1);对于行创建((&amp; n-&gt; children [i]),b,d-1);,它的工作原理 对于任何d和b都是完美的,据我测试过。但这两行 真的是一样的!!!只是子结构的地址
两行 NOT 与指针算法考虑对象的类型相同,并且它正确地调整了具有该对象类型大小的结果地址。 所以:
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运算符被添加错误地添加,而第二个则由指针算法自动添加。
对于d <6和b <6,它工作正常,但是当b = 6且d = 6或更大时,它 给我一个分段错误。
它适用于较小的数字,因为malloc
函数在进程空间中映射的内存多于性能原因所需的内存。当您超出正确映射的内存区域时,您会遇到分段错误。
malloc不会分配一个连续的内存块吗?
是的,malloc
分配一个连续内存块。