c语言 - 理解指针和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. 当分配给malloc(sizeof(island));时,i变量会发生什么,它只是临时存储堆上分配的新内存空间的引用吗?

  2. 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()返回的相同指针。

  1. malloc 返回分配的内存块的地址,因为 void* 是一种通用指针类型,该地址(像任何其他值一样)被复制到 i。
  2. 从 Malloc 返回的地址存储在 p_island0 中。 *从malloc返回的地址是堆内存,分配的内存一直存在到"free"函数被调用或程序结束。

可能是一个结构体。

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

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

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

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

相关内容

  • 没有找到相关文章