理解指针和malloc

Posted

技术标签:

【中文标题】理解指针和malloc【英文标题】:Understanding pointers & malloc 【发布时间】:2016-09-29 01:32:37 【问题描述】:

我目前正在学习 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)); 时会发生什么情况,它只是临时存储在 HEAP 上分配的新内存空间的引用吗?

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

【问题讨论】:

【参考方案1】:

island 可能是一个结构体。

函数 create(char *name) 有自己的作用域

island *i = malloc(sizeof(island));

该语句分配由i指向的内存。 因此,i 仅限于该函数的范围。这在函数之外是无法访问的。

但是,该函数返回 i 指向的值(内存位置),最终将存储在 p_island0 中。

【讨论】:

【参考方案2】:
    malloc 返回分配的内存块的地址,因为 void* 是通用指针类型,地址(与任何其他值一样)被复制到 i。 malloc 返回的地址存储在 p_island0 中。 *从 malloc 返回的地址是堆内存,分配的内存将一直存在,直到'free'函数被调用或直到程序结束。

【讨论】:

【参考方案3】:

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

i 存储malloc() 返回的指针。稍后,它作为函数的返回值返回。动态内存的生命周期等于程序运行时(除非被free()手动释放),所以存储在指针指向的内存区域中的值在函数返回后是有效且可访问的。

FWIW,这里要注意,在使用malloc()的返回值之前,最好先对照NULL检查返回值,以免malloc()失败时出现UB。

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

malloc()返回的指针相同。

【讨论】:

【参考方案4】:

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

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

【讨论】:

也许扩展“pointer”以读取“pointer value”?因为它是关于“复制”。

以上是关于理解指针和malloc的主要内容,如果未能解决你的问题,请参考以下文章

free函数和malloc函数

《深入理解C指针》学习笔记--- 指针之外

深入理解glibc malloc:malloc() 与 free() 原理图解

深入理解glibc malloc:malloc() 与 free() 原理图解

为啥 malloc 返回一个指针?指针有啥用?

使用 malloc() 分配的指针实例化一个类 [重复]