我目前正在学习C语言,我正努力把自己的脑袋绕在指针和malloc()函数上。
所以在我的书中,我定义了以下函数:

island* create(char *name) {
   island *i = malloc(sizeof(island));
   i->name = strdup(name);
   i->opens = "09:00";
   i->closes = "17:00";
   i->next = NULL;
   return i;
}

然后就这样叫:
char name[80];
fgets(name, 80, stdin);
island *p_island0 = create(name);

在这个代码示例中,我很难理解以下几点:
当分配给i时,malloc(sizeof(island));变量会发生什么情况,它只是临时存储堆上分配的新内存空间的引用吗?
island *p_island0 = create(name);之后,最终存储在p_island0中的是什么?由malloc()或创建的地址是另一个指针,前一个i变量的值复制到了…堆叠?

最佳答案

当您执行return i;操作时,存储在i中的指针值将复制到调用函数中的变量p_island0中,然后i将超出范围。分配的内存永远不会超出范围,它有完整程序的生命周期,或者直到您使用指针值调用free为止。哪个变量存储指针值无关紧要,只要它是malloc调用返回的原始指针值。
函数返回值的方式不是由C规范指定的,这取决于编译器、操作系统和底层硬件。很可能不涉及堆栈,但返回的值存储在CPU寄存器中。

10-07 20:22