我目前正在学习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
?
答案 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)
答案 3 :(得分:0)
岛可能是一个结构。
函数create(char * name)有自己的范围
island *i = malloc(sizeof(island));
此语句分配由 i 指向的内存。 因此, i 仅限于此功能的范围。在功能之外无法访问。
但是,该函数返回 i 指向的值(内存位置),该值最终将存储在 p_island0 中。