【问题标题】:The use of a pointer to an unnamed struct in C?在 C 中使用指向未命名结构的指针?
【发布时间】:2014-04-02 18:53:30
【问题描述】:

类似的东西有什么用

typedef struct
{
    int field_1;
    float field_2;
}*T;

C?

由于structC中的数据类型,其中存储了T所指向的数据类型的相关信息,以及如何正确初始化声明为T var的变量var

【问题讨论】:

  • T var = malloc(sizeof(*var))
  • @GrijeshChauhan 这是有效的标准C 语法吗?看起来像一种解决方法;我以前从未见过这个。
  • 语法是有效的(否则程序将无法编译:))它可能是一种解决方法(见我的回答)
  • @Ashalynd 大多数情况下,即使是显示未定义行为迹象的代码也会编译,我问是因为这是我第一次看到这种语法,我无法想象真正有效在这是一种好的/唯一的编码方式时使用它。
  • 你在哪里遇到的?如果您提供更多背景知识,您可能会得到更好的答案。

标签: c pointers struct


【解决方案1】:

T 是指向结构的指针的别名。结构体本身不是类型,但T 是。

T 不存储在任何地方,而是存储在类型的编译器内部表中。

你可以像这样使用它

T myVariable = malloc(sizeof(*myVariable));

【讨论】:

  • 在某些应用程序或场景中这是有用的还是唯一可行的方法?
【解决方案2】:

我希望使用类似的东西(指向未命名结构的指针)来描述来自相关程序外部的数据(例如,作为库函数的返回值,当它由该库分配和释放)。那么这样的 typedef 只是一个规范如何访问这些数据。

【讨论】:

    【解决方案3】:

    使用就像结构被命名一样。 IE。您可以通过此指针访问结构字段。例如:

    void fun(T p) {
       if (p->field_1 == 0) p->field_2 = 1.2345;
    }
    

    如果您从不需要通过名称引用结构本身,则无需给它一个名称。有关结构(及其成员)的信息以与命名结构相同的方式存储在编译器表中。

    这种结构在定义复杂的数据结构(可能带有联合)时很有用,并且不会用无用的名称污染全局名称空间。例如:

     struct myUsefulStructure {
        int stype;
        union {
           struct {  // a structure which is never referenced itself
              ...
           } x;
           struct {  // another structure which is never referenced itself
              ...
           } y;
        } u;
      };
    

    【讨论】:

    • 如果你知道你永远不需要这个(子)结构类型的变量,那么你就不需要为它发明一个名字,并且冒着可能与其他一些现有结构名称发生冲突的风险。跨度>
    • @user2485710 联合是为多个数据重用同一个地方的方法。如果使用联合,通常它由结构组成。通常这些结构不会在其他地方使用。没有技巧,只是一个例子。
    猜你喜欢
    • 1970-01-01
    • 2021-07-14
    • 2010-09-25
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 2017-01-04
    相关资源
    最近更新 更多