【问题标题】:How to reference two structures in C properly?如何正确引用 C 中的两个结构?
【发布时间】:2018-08-27 08:19:15
【问题描述】:

我有一个结构定义为:

typedef struct{
       int pages;
    }book;

我先声明一个实例:

book *b=malloc(sizeof(book));
b->pages=35;

然后我将另一本书的指针声明为:

book *a;
a=&b;

调试后我发现结构a 中的成员与b 不一样?我在a 中得到pages 的错误值。

a不应该指向b的内存吗?如何正确取消引用a?对不起,如果我没有正确理解指针的概念。

【问题讨论】:

  • &b 的类型是什么?您是否使用 -Wall -Wextra -pedantic 编译并获得了无警告构建?
  • a 类型为pointer to book&b 类型为 pointer to pointer to book。你可能打算在这里做a = b
  • a=&b; 不是有效的 C 代码并且不会编译,所以这就是原因。
  • @user3597222:指针变量不包含结构数据;它仅包含对数据所在位置的“参考”。 malloc(sizeof (book)) 为结构数据分配内存,并返回指向它的指针(“引用”)。您可以将该值分配给任意数量的指针,它们都将平等地引用相同的书籍数据。 -> 运算符告诉编译器左侧是指向结构的指针,右侧命名表达式应计算为的成员。与. 相比,左侧指的是结构,而不是指向结构的指针。

标签: c pointers reference structure


【解决方案1】:

您在这里所做的是将b 的地址存储在a 中。现在取消引用a 时,您将获得存储在b 中的内容,这是您的图书存储位置的地址,而不是图书本身。事实上,我认为您在尝试访问 a->pages 时应该会遇到分段错误,因为甚至没有分配此内存。

所以我认为您在这里要做的是使a 成为指向与b 相同的book 结构的指针,您只需这样做即可实现

book *a = b;

【讨论】:

    【解决方案2】:

    为此,您需要将a 设为指向指针的指针,因为b 是指针。

    book **a;
    a=&b;
    

    您可以使用a 仅使用指针执行以下操作。

    book *a;
    a=b;
    

    【讨论】:

    • double指针”和“指向指​​针的指针”是有区别的。
    • 按照你写的方法,当我在a处改变pages的值时,我在b处也得到它可以吗?
    【解决方案3】:

    你在用这条线做什么:

    a=&b;
    

    是将指向book的指针分配给指向book的指针。

    通常,编译器会发出如下所示的错误:

     error: cannot convert 'book**' to 'book*' in assignment.
    

    但是看起来你已经直接在调试模式下运行它了。 所以最好编译代码,删除所有错误和警告,然后开始调试。

    【讨论】:

      【解决方案4】:

      首先你要知道指针是一个变量,它也是有地址的,你定义一个指针变量,如果你不给它申请空间,系统会自动给它一个空间,所以,如果你想让两个指针相等,你必须定义一个辅助指针,那么指向地址的辅助指针本身就是另一个指针。所以你应该像这样改变它

      book **a;  //a is a second level pointer
      a=&b;      //Now a is pointing to the address of b itself,Because b has an address
      

      【讨论】:

        猜你喜欢
        • 2018-04-27
        • 2022-06-23
        • 1970-01-01
        • 2021-11-27
        • 2013-11-05
        • 2015-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多