对堆使用指定的初始化器
Using Designated Initializers with the Heap
可以使用 designated initializers
如下所示(对于 "billy")没有问题,但是当在动态内存上使用相同的初始化方法时,事情会在编译时中断。
使用指定初始化器有什么限制?
除了我们正在写入的 where(即地址)之外,这两个初始化有什么不同?为什么我们不能对动态内存使用指定的初始值设定项?
struct student{
char *name;
int age;
};
void print_student(struct student* st){
printf("Student: %s is %d years old\n", st->name, st->age);
}
int main(void) {
srand(time(NULL));
struct student *molly_ptr = malloc(sizeof(struct student));
struct student billy = {
.name = "billy",
.age = rand()%30
};
*molly_ptr = {
.name = "molly",
.age = 25
};
//molly_ptr->name = "molly";
//molly_ptr->age = 25;
print_student(&billy);
print_student(molly_ptr);
return 0;
}
error: expected expression before '{' token
*molly_ptr = {
^
你必须写:
*molly_ptr = (struct student){
.name = "molly",
.age = 25
};
使用复合文字:
*molly_ptr = ( struct student ){ .name = "molly", .age = 25 };
这几乎等同于:
struct student temp = { .name = "molly", .age = 25 };
*molly_ptr = temp;
可以使用 designated initializers
如下所示(对于 "billy")没有问题,但是当在动态内存上使用相同的初始化方法时,事情会在编译时中断。
使用指定初始化器有什么限制?
除了我们正在写入的 where(即地址)之外,这两个初始化有什么不同?为什么我们不能对动态内存使用指定的初始值设定项?
struct student{
char *name;
int age;
};
void print_student(struct student* st){
printf("Student: %s is %d years old\n", st->name, st->age);
}
int main(void) {
srand(time(NULL));
struct student *molly_ptr = malloc(sizeof(struct student));
struct student billy = {
.name = "billy",
.age = rand()%30
};
*molly_ptr = {
.name = "molly",
.age = 25
};
//molly_ptr->name = "molly";
//molly_ptr->age = 25;
print_student(&billy);
print_student(molly_ptr);
return 0;
}
error: expected expression before '{' token
*molly_ptr = {
^
你必须写:
*molly_ptr = (struct student){
.name = "molly",
.age = 25
};
使用复合文字:
*molly_ptr = ( struct student ){ .name = "molly", .age = 25 };
这几乎等同于:
struct student temp = { .name = "molly", .age = 25 };
*molly_ptr = temp;