malloc()函数分配的内存的生命周期

gbo*_*box 0 c malloc pointers

如果我向函数传递一个指针,其中指针获取分配内存的地址,那么当函数退出时是否释放了内存?

void initWomenList(Women **head, Women *headWoman) {        
  headWoman = (Women *) malloc(sizeof(Women));
  if (headWoman == NULL) {
      printf("Allocation of headWoman failed\n");
      exit(1);
  }
  headWoman->userWoman = NULL;
  headWoman->next = NULL;

  head = &headWoman;
}
Run Code Online (Sandbox Code Playgroud)

当函数返回时,head和headWoman都是NULL吗?

til*_*z0R 7

C语言中没有自动内存释放(有时称为垃圾收集器).malloc/calloc/realloc必须使用free函数手动释放分配的任何内存.

C语言中的所有函数参数都是按值传递的,因此赋值headWomen内部函数在外部没有任何影响,目前您有内存泄漏,因为没有指针保存已分配的内存.

void
alloc_mem(int* a) {
    a = malloc(sizeof(*a));
}

//usage in your case
int* a;
//Function will allocate memory for single int, but it won't be saved to variable a.
alloc_mem(a);
Run Code Online (Sandbox Code Playgroud)

更好的方法是使用指针指针或从函数返回指针.

int*
alloc_mem() {
    return malloc(sizeof(int));
}

//usage
int* a = alloc_mem();
if (a != NULL) {
    //Check if null
}
Run Code Online (Sandbox Code Playgroud)

或者使用指针指针方法

void
alloc_mem(int** a) {
    *a = malloc(sizeof(**a));
}

//usage
int* a;
alloc_mem(&a);
if (a != NULL) {
    //Do the job.
}
Run Code Online (Sandbox Code Playgroud)

在所有这些操作结束时,始终调用free函数

free(a);
Run Code Online (Sandbox Code Playgroud)

如果我回到您的初始示例,您必须将函数重写为以下内容:

void 
//Notice here **headWoman instead of *headWoman
initWomenList(Women **head, Women **headWoman) {  
  //Notice here *headWoman instead of headWoman      
  *headWoman = malloc(sizeof(Women));
  if (headWoman == NULL) {
      printf("Allocation of headWoman failed\n");
      exit(1);
  }
  headWoman->userWoman = NULL;
  headWoman->next = NULL;

  //Notice here *head instead of head
  *head = &headWoman;
}
Run Code Online (Sandbox Code Playgroud)

用法:

Woman* headWoman;
Woman* head;

initWomenList(&head, &headWoman);
//Don't forget to free memory after usage.
Run Code Online (Sandbox Code Playgroud)