【问题标题】:allocating memory for Pointers to structure within structure为结构内结构的指针分配内存
【发布时间】:2011-11-01 11:17:08
【问题描述】:

我有两个结构:

struct b{int b;float d;}; and 
struct a{int count; struct b* ptr;}
struct a *a_temp;

现在我为 10 个类型 b 的结构分配内存,并将地址放在结构 a 的 ptr 中。 (代码给了我,他们出于某种原因不想使用双指针)

a_temp = (struct a*)malloc(sizeof(struct a));
a_temp->ptr = (struct b*)malloc(10*sizeof(struct b));
struct b* b_temp;

我必须将 b 类型的第二个结构的地址加载到 temp_b。 我试过b_temp = a_temp->ptr[1];,它给出了错误 但是当我尝试使用它并使用它访问结构 b 的内容时,b_temp = &(a_temp->ptr[1]); 正在工作,这是为什么呢?

提前致谢

【问题讨论】:

    标签: c pointers dynamic-allocation


    【解决方案1】:

    ptr[1]是结构体,由ptr + 1指向(就像*(ptr+1)一样),b_temp得到一个结构体指针,所以你要传递a_temp->ptr[1]的地址,也就是&a_temp->ptr[1]

    expression      | type
    ---------------------------
    a_temp->ptr     | struct b*
    a_temp->ptr[1]  | struct b
    &a_temp->ptr[1] | struct b*
    a_temp->ptr + 1 | struct b*
    b_temp          | struct b*
    

    编辑:

    如果你有一个指针,比如说int * x,那么下面的表达式是相同的:x[1]*(x+1),它们都遵循地址x+1。换句话说,这些表达式值是指针x 指向的变量类型,在这种情况下它是int,因为xint *(指向int 的指针)它包含一个地址到int变量。

    【讨论】:

    • 您好,感谢您的快速回复,我知道 a_temp->ptr 是指向 b 类型结构的指针,但我不明白 a_temp->ptr[1] 是如何变成结构的,它将是如果你能多解释一下,真的很棒。我认为 ptr[1] 将包含分配创建的第二个结构的地址,即 ptr 将只包含分配的基地址,当我们执行 ptr[1] 时,它只会添加1*(结构大小)获取下一个结构的地址。请纠正我
    • 嗨,谢谢,我明白了,如果可能的话,你能帮我用双指针做同样的事情吗..