我对语法和代码有一个快速的疑问。
我刚刚发现了一种用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 };
这行不通。当使用指针作为上面的代码时,是否有任何语法可以给出相同的结果?
谢谢!
答案 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
仍指向自动内存(如局部变量)。