c - 了解指针和 malloc

标签 c pointers struct return malloc

我目前正在学习 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);

在这个代码示例中有几件事我很难理解:

  1. i变量赋值给malloc(sizeof(island));时会发生什么,是不是只是临时存放新内存空间的引用分配在 HEAP 上?

  2. island *p_island0 = create(name); 之后,p_island0 中最终存储了什么?由 malloc() 创建的地址或者是另一个创建的指针,并且先前的 i 变量的值复制到 ... STACK 上的 p_island0 ?

最佳答案

当您执行 return i; 时,存储在 i 中的指针值被复制到变量 p_island0 中调用函数,然后 i 超出范围。分配的内存永远不会超出范围,它具有整个程序的生命周期,或者直到您使用指针值调用 free 为止。哪个变量存储指针值并不重要,只要它是 malloc 调用返回的原始指针值即可。

函数如何返回值 C 规范没有指定,它取决于编译器、操作系统和底层硬件。很可能不涉及堆栈,但返回值存储在 CPU 寄存器中。

关于c - 了解指针和 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37538892/

相关文章:

c++ - 对图像中的一系列颜色进行阈值处理

c - 如何在 C 中从/到不同的架构运行代码?

c - 包含指针的函数的函数原型(prototype)

C 结构体的成员数组

c - 如何检查结构中未使用的成员?

c - 为什么我们需要一个未使用的字符数组才能成功绑定(bind)?

c++ - 优化子集和实现

c++ - 如何深拷贝链表对象指针

带指针的 C++ 默认参数

c - C 中的动态内存分配不起作用