2

我实现了这个函数来创建一个 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 或更大时,它会给我一个分段错误。

但是当我更改行时create((n->children+i*sizeof(node)), b, d-1); 对于行create((&n->children[i]), b, d-1); ,据我测试,它适用于任何 d 和 b。但是这两条线真的是一样的!!!只是孩子结构的地址....那么,有人知道为什么会这样吗?malloc 不是分配一个连续的内存块吗?

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

谢谢=),

英格丽德

4

1 回答 1

1

你已经回答了你的问题。:D

但是当我更改行时 create((n->children+i*sizeof(node)), b, d-1); 对于 create((&n->children[i]), b, d-1); 行,据我测试,它适用于任何 d 和 b。但是这两条线真的是一样的!!!只是子结构的地址

这两行并不相同,因为指针算术考虑了对象的类型,并且它正确地使用该对象类型的大小调整了结果地址。所以 :

   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分配一个连续的内存块。

于 2013-10-30T18:21:22.227 回答