【问题标题】:Pointer to pointer to variable of struct in C指向 C 中结构变量的指针
【发布时间】:2021-10-15 23:07:51
【问题描述】:

我有:

typedef struct a{  
    int var;  
}aa;


typedef struct b{
    aa *a;
}bb;

int main()
{   
    
    bb *b;
    b->a->var;
    return 0;
}

struct a 嵌套在 b 中。 如何使用 2 指针初始化变量 var 的值,如下所示: b->a->var; ?

【问题讨论】:

  • 结构 a 没有嵌套在 b 中(即 b 的一部分),它只是被 b 的某个成员(可能是许多指针成员之一)指向。

标签: c pointers struct


【解决方案1】:
  1. b初始化为一个有效的指针。
  2. b->a初始化为一个有效的指针。
  3. 初始化b->a->var
#include <stdlib.h>

typedef struct a{
    int var;
}aa;

typedef struct b{
    aa *a;
}bb;

int main(void)
{
    bb *b;
    /* initialize b */
    b = malloc(sizeof(*b));
    if (b == NULL) return 1;
    /* initialize b->a */
    b->a = malloc(sizeof(*b->a));
    if (b->a == NULL)
    {
        free(b);
        return 1;
    }
    /* initialize b->a->var */
    b->a->var = 42;
    
    /* free what are allocated */
    free(b->a);
    free(b);
    
    return 0;
}

【讨论】:

    【解决方案2】:

    struct a 没有嵌套在 struct b 中,但 struct b 包含一个指向 a struct a object 的指针。

    两个对象的指针可以独立初始化 例如:先为a分配内存,然后为b分配内存,最后将a分配的内存分配给b-&gt;a。 不过,最好先为b分配内存:

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct {
        int var;
    } aa;
    
    typedef struct {
        aa *a;
    } bb;
    
    int main() {
        bb *b = (bb*) malloc(sizeof *b);
        b->a = (aa*) malloc(sizeof *(b->a));
    
        b->a->var = 5;
        printf("%d\n", b->a->var);
    
        free(b->a);
        free(b);
    }
    

    (为简洁起见,检查malloc 的返回值。)

    注意以相反的顺序释放内存。如果b 会首先被释放,那么指向a 的指针就会丢失。 另外,请注意 typedef 没有声明额外未使用的 struct astruct b

    【讨论】:

    • 您不需要从malloc 转换返回值。见:stackoverflow.com/questions/605845/…
    • @TimRandall 有趣,谢谢!我已将代码更新为sizeof 的另一个变体。选角问题的双方都有争论。现在我保留演员表,因为我发现隐式演员表比轻微的混乱/重复更大的邪恶。
    猜你喜欢
    • 1970-01-01
    • 2021-07-14
    • 2012-02-07
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多