理解指针&的malloc

时间:2016-05-31 06:59:33

标签: 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

4 个答案:

答案 0 :(得分:1)

  

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

可能是一个结构。

函数create(char * name)有自己的范围

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

此语句分配由 i 指向的内存。 因此, i 仅限于此功能的范围。在功能之外无法访问。

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