使用指定的初始化程序与堆

时间:2016-02-16 15:30:18

标签: c heap designated-initializer

可以使用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 = {
               ^

2 个答案:

答案 0 :(得分:4)

使用复合文字:

*molly_ptr = ( struct student ){ .name = "molly", .age = 25 };

这几乎与:

相同
struct student temp = { .name = "molly", .age = 25 };
*molly_ptr = temp;

答案 1 :(得分:3)

你必须写:

*molly_ptr = (struct student){
                                .name = "molly",
                                .age = 25
                             };