【问题标题】:Weird thing happening with dynamic allocated memory动态分配的内存发生了奇怪的事情
【发布时间】:2013-10-30 16:39:29
【问题描述】:

我实现了这个函数来创建一个 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

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

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

谢谢=),

英格丽德

【问题讨论】:

  • n-&gt;children+i 等价于 &amp;n-&gt;children[i] 。只需删除 * sizeof
  • ideone.com/uPwIG7 正如您在此处看到的,指针算法已经处理了计算中的对象大小
  • @SHR 显然是答案。我正要输入它,但发布它,我会投票并继续前进。
  • OT:在 C 中,没有必要也不建议强制转换 malloc/calloc/realloc:stackoverflow.com/a/605858/694576

标签: c


【解决方案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-&gt;children)+ (i * sizeof(struct node)) 同时,您的代码:

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

被翻译成(n-&gt;children)+ (i * sizeof(struct node))*sizeof(struct node)。 第一个 sizeof 运算符是您错误添加的,而第二个是指针算法自动添加的。

对于 d

它适用于少量,因为malloc 函数在进程空间中映射的内存比出于性能原因所需的内存更多。当您超出正确映射的内存区域时,您遇到了分段错误。

malloc 不是分配一个连续的内存块吗?

是的,malloc 分配了一个连续的内存块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 2022-01-22
    • 2013-02-27
    • 2021-05-19
    • 2021-09-25
    • 2011-09-16
    相关资源
    最近更新 更多