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

4
我可以帮您翻译。这段文字的意思是:如何使用指定初始化的结构体指针?例如,我知道如何使用点运算符和指定初始化来初始化结构体,像这样:
person per = { .x = 10,.y = 10 };

但如果我想用结构体指针来实现呢?

我尝试了这个方法,但没有成功:

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

你不能使用指定的初始化器来初始化一个指向结构体的指针,因为指针是标量类型。你可以将一个指针赋值给另一个指针。 - undefined
不要在你的问题中添加“谢谢”,考虑接受一个答案 - undefined
你想用这个指针解决什么问题? - undefined
接受了第一个答案,谢谢。 - undefined
3个回答

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

4
一个复合字面量看起来像一个大括号包围的初始化器列表的转换形式。它的值是指定类型的对象,包含在初始化器中指定的元素。这里有一个参考链接: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;
}

1
您可以使用指向复合字面量的指针:

struct NODE{
   int x;
   int y;
}


struct NODE *nodePtr = &(struct NODE) {
    .x = 20,
    .y = 10
};

请注意,C99引入了复合文字。

1
如果这个用在一个函数内部,那么复合字面的生命周期将会在与其关联的代码块结束时终止。以这种方式初始化指针应该警告学生们不要轻率使用。 - undefined
@EricPostpischil 谢谢你提供的信息。当有人使用时,这将会非常有帮助。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接