分享
为什么问答平台  ›  专栏  ›  技术社区  ›  Amaterastis

为结构指针赋值的语法 - Syntax to assign values to struct pointer

  •  0
  • Amaterastis  · 技术社区  · 2 周前

    我有一个关于语法和代码的快速问题。

    我刚刚找到了一种用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_名称可以很好地工作,您可以按任意顺序分配它。我喜欢这种方法,所以我开始试验,结果撞到了墙上。 如果我要申报:

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

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

    谢谢!

    1 回复  |  直到 2 周前
        1
  •  0
  •   melpomene    2 周前

    一般来说,您不能“为指针赋值”。指针只存储一个值,该值是已存在对象的地址。

    如果有指向现有结构变量的指针,则可以初始化该变量:

    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 仍然指向自动内存(如局部变量)。