下面的 employee.c 演示了如何在函数中通过malloc分配堆内存,并返回调用方。
为关注重点,把memset()和free()都省了。
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct employee { char name[8]; } emp; // 1、声明结构体,这是打算malloc的类型。 void create(emp** ppe, char* name); int main(void) { emp* pe = NULL; // 2、定义结构体指针,等待malloc create(&pe, "Jack"); // 3、把结构体指针的地址做实参传给函数(pe取地址就是ppe) printf("Employee %s is here.\n", pe->name); return 0; } void create(emp** ppe, char* name) // 4、形参接收结构体指针的地址(值传递) { emp* pe = (emp*)malloc(sizeof(emp)); strcpy(pe->name, name); *ppe = pe; // 5、将malloc后的结构体指针赋值给解引用的形参(ppe解引用就是pe) //ppe = &pe; // 6、严重错误!!!pe即将出栈,&pe就是个野指针! // 另外,ppe作为形参,即便持有&pe,也不会改变实参的值。 // 记住!永远不要返回局部变量的地址。 }
运行结果如下: