如何使用结构指针和指定初始化来初始化 C 结构

问题描述

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

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

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

我做了这个,但没有用:

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

解决方法

如果 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;
,

复合字面量看起来像花括号括起来的初始化列表的转换。它的值是一个类型转换中指定的对象,包含初始化器中指定的元素。这是一个 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;
}
,

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

struct NODE{
   int x;
   int y;
}


struct NODE *nodePtr = &(struct NODE) {
    .x = 20,.y = 10
};
  • 请注意,C99 中引入了复合字面量。