我目前正在学习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);
在此代码示例中,我很难理解几件事:
当分配给
malloc(sizeof(island));
时,i
变量会发生什么,它只是临时存储堆上分配的新内存空间的引用吗?island *p_island0 = create(name);
之后,最终p_island0
里储存了什么?malloc()
创建的地址,或者是创建的另一个指针,并且上一个i
变量的值p_island0
复制到 ...叠?
当您这样做return i;
存储在i
中的指针值将复制到调用函数中的变量p_island0
,然后i
超出范围。分配的内存永远不会超出范围,它具有完整程序的生命周期,或者直到您使用指针值调用free
。哪个变量存储指针值并不重要,只要它是malloc
调用返回的原始指针值即可。
函数如何返回值不是由 C 规范指定的,它取决于编译器、操作系统和底层硬件。很可能不涉及堆栈,但返回值存储在 CPU 寄存器中。
1. 当分配给 malloc(sizeof(island));时,i 变量会发生什么,它只是临时存储堆上分配的新内存空间的引用吗?
i
存储malloc()
返回的指针。稍后,该值将作为函数的返回值返回。动态内存的生存期等于程序运行时(除非由free()
手动释放),因此存储在指针指向的内存区域中的值在函数返回后有效且可访问。
FWIW,这里要注意的是,在使用malloc()
的返回值之前,最好对照NULL
检查返回值,以避免 UB,以防malloc()
失败。
2.孤岛
*p_island0 = create(name);
之后,最终p_island0
里储存了什么?malloc()
创建的地址,还是创建了另一个指针并将前一个i
变量的值复制到p_island0
?
返回malloc()
返回的相同指针。
- malloc 返回分配的内存块的地址,因为 void* 是一种通用指针类型,该地址(像任何其他值一样)被复制到 i。
- 从 Malloc 返回的地址存储在 p_island0 中。 *从malloc返回的地址是堆内存,分配的内存一直存在到"free"函数被调用或程序结束。
岛可能是一个结构体。
函数 create(char *name) 有自己的作用域
island *i = malloc(sizeof(island));
此语句分配由i指向的内存。 因此,i仅限于此函数的范围。这在函数外部无法访问。
但是,该函数返回i指向的值(内存位置),该值最终将存储在p_island0中。