为结构指针分配值的语法

时间:2019-05-04 10:03:07

标签: c struct

我对语法和代码有一个快速的疑问。

我刚刚发现了一种用C声明结构的方法,这与到目前为止所见的有点不同。

这是示例代码:

#include <stdio.h>
struct student {
    int age;
    int grade;
    char* name;
};
int main () {
    struct student s = { .name = "Max", .age = 15, .grade = 8 };
    return 0;
}

将变量分配为.var_name效果很好,您可以按任意顺序分配变量。我喜欢这种方法,所以我开始尝试,因此遇到了麻烦。 如果我要声明:

struct student *s = { ->name = "Max", ->age = 15, ->grade = 8 };

这行不通。当使用指针作为上面的代码时,是否有任何语法可以给出相同的结果?

谢谢!

1 个答案:

答案 0 :(得分:0)

通常来说,您不能“将值分配给指针”。指针仅存储一个值,这是一个已经存在的对象的地址。

如果您有一个指向现有struct变量的指针,则可以将其初始化:

struct student s = { .name = "Max", .age = 15, .grade = 8 };
struct student *p = &s;

如果要使用动态内存分配,事情会有些棘手:

struct student *p = malloc(sizeof *p);
if (!p) {
    ...
}

malloc为您提供了未初始化的内存,并且您不能对现有对象使用初始化器语法。

但是您可以使用涉及复合文字的技巧(自C99起可用):

*p = (struct student){ .name = "Max", .age = 15, .grade = 8 };

在这里,我们使用复合文字来创建一个新的未命名结构对象,然后将其内容复制到*p中。

在第一个示例中,可以使用相同的功能来摆脱s

struct student *p = &(struct student){ .name = "Max", .age = 15, .grade = 8 };

但是在此版本中,p仍指向自动内存(如局部变量)。