Можно использовать designated initializers
, как показано ниже (для «билли») без проблем, но когда тот же подход к инициализации используется в динамической памяти, вещи будут разбиваться во время компиляции.Использование назначенных инициализаторов с кучей
Каковы ограничения на использование назначенных инициализаторов?
Помимо , где (т. Е. Адрес), который мы пишем, что отличает эти две инициализации? Почему мы не можем использовать назначенные инициализаторы с динамической памятью?
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 = {
^
Инициализация и назначение - это две разные вещи. Вторая вещь, которую вы пытаетесь сделать, - это назначение. Этот синтаксис недоступен для AFAIK. (Не связано с кучей/стек.) – Mat
'char * name' предпочтительно следует объявлять как' const char * name'. – Lundin
@ Lundin, код был создан только для этого вопроса. Существует также технически утечка памяти. – sherrellbc