【发布时间】:2016-05-27 23:13:53
【问题描述】:
可以毫无问题地使用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 = {
^
【问题讨论】:
-
初始化和赋值是两个不同的东西。您尝试做的第二件事是分配。该语法不适用于那些 AFAIK。 (与堆/堆栈无关。)
-
char *name最好声明为const char *name。 -
@Lundin,代码仅针对这个问题生成。从技术上讲,还有内存泄漏。
-
@Lundin:但从技术上讲,实际上并非如此。每个资源都在
main退出之前释放,您的操作系统也带有内存管理系统,它会在您的进程退出后释放所有内存。例如,Git 根本不会释放任何资源。
标签: c heap-memory designated-initializer