c - 为结构体指针赋值的语法

标签 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 };

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

谢谢!

最佳答案

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

如果你有一个指向现有结构变量的指针,你可以直接初始化它:

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

关于c - 为结构体指针赋值的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55981428/

相关文章:

c - Domino 程序问题

c - c 中的素数和立方和

c++ - 什么时候应该使用统一初始化?

c - c中的while循环不重复

c - 如何使用函数按字典顺序对分割命令行参数进行排序?

C++ 静态结构模板方法返回枚举类型

c - 类型定义一个枚举类型作为结构

c - 当我将函数从 main 中分离出来时,结构出现问题

c - 这个程序的输出是什么以及如何?

c - 如何使用 GNU getopt 获取输入参数的长度