动态分配的内存发生了奇怪的事情

时间:2013-10-30 16:39:29

标签: c

我实现了这个函数来创建一个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不分配一个连续的内存块吗?

这件事让我很困惑!!请帮忙!

谢谢=),

英格丽

1 个答案:

答案 0 :(得分:1)

你回答了你的问题。 :D

  

但是当我更改行创建((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分配一个连续内存块。