关于语法和代码,我有一个简短的问题。
我刚刚发现了一种在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 };
这不管用。在使用上面的代码时,是否有任何语法可以给出相同的结果?
谢谢!
发布于 2019-05-04 02:24:07
一般来说,你不能“给指针赋值”。指针只存储单个值,该值是已存在对象的地址。
如果有指向现有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 };
在这里,我们使用复合文字来创建一个新的未命名的struct对象,然后将其内容复制到*p
中。
在第一个示例中,可以使用相同的特性来消除s
:
struct student *p = &(struct student){ .name = "Max", .age = 15, .grade = 8 };
但是在这个版本中,p
仍然指向自动内存(就像局部变量)。
https://stackoverflow.com/questions/55981428
复制