【问题标题】:How To Initialize a C Struct using a Struct Pointer and Designated Initialization如何使用结构指针和指定初始化来初始化 C 结构
【发布时间】:2021-05-26 19:14:06
【问题描述】:

如何使用带有指定初始化的结构指针?例如,我知道如何使用点运算符和指定的初始化来初始化结构,例如:

person per = { .x = 10,.y = 10 };

但是如果我想用结构指针来做呢?

我做了这个,但是没有用:

    pper = (pperson*){10,5};

【问题讨论】:

  • 您不能使用指定的初始化器初始化指向结构的指针,因为指针是标量类型。您可以使用指针分配指针。
  • 而不是在您的问题中添加“谢谢”,请考虑accepting an answer
  • 你想用指针解决什么问题?
  • 接受第一个答案谢谢

标签: c struct initialization designated-initializer


【解决方案1】:

如果pper 是指向已分配内存的person *,则可以使用复合文字为*pper 赋值,例如:

*pper = (person) { 10, 5 };
*pper = (person) { .x = 10, .y = 5 };

如果它还没有指向分配的内存,你必须为它分配内存,然后你可以赋值:

pper = malloc(sizeof *pper);
if (!pper)
{
    fputs("Error, unable to allocate memory.\n", stderr);
    exit(EXIT_FAILURE);
}
*pper = (person) { 10, 5 };

或者您可以将其设置为指向现有对象:

pper = &SomeExistingPerson;

【讨论】:

    【解决方案2】:

    复合文字看起来像大括号括起来的初始值设定项列表的强制转换。它的值是强制转换中指定类型的对象,包含初始化程序中指定的元素。这是reference

    例如,struct pperson 如下所示:

    #include <stdio.h>
    #include <malloc.h>
    
    
    struct pperson
    {
       int x, y;
    };
    
    int main()
    {
    
       // p2 is a pointer to structure pperson.
       // you need to allocate it in order to initialize it
       struct pperson *p2;
       p2 = (struct pperson*) malloc( sizeof(struct pperson));
       *p2 = (struct pperson) { 1, 2 };
       printf("%d %d\n", p2->x, p2->y);
    
       // you may as well intiialize it from a struct which is not a pointer
       struct pperson p3 = {5,6} ;
       struct pperson *p4 = &p3;
       printf("%d %d\n", p4->x, p4->y);
    
       free(p2);
       return 0;
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用指向复合文字的指针:

      struct NODE{
         int x;
         int y;
      }
      
      
      struct NODE *nodePtr = &(struct NODE) {
          .x = 20,
          .y = 10
      };
      
      • 请注意,复合文字是在 C99 中引入的。

      【讨论】:

      • 如果在函数内部使用 this,复合文字的生命周期在其关联块的执行结束时结束。在没有提醒学生的情况下,绝不应该向学生教授以这种方式初始化指针。
      • @EricPostpischil 感谢您提供信息。当有人使用它时会很有帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      相关资源
      最近更新 更多