Cấp phát bộ nhớ cho struct qua function trong C

Mọi người có thể giải thích cho em tại sao ta không thể cấp phát bộ nhớ cho struct qua function trong C được ko ạ?

Ví dụ ở đây là con trỏ struct node.

Code :

#include<stdio.h>
#include<stdlib.h>

typedef struct node{
   int val;
   struct node *next;
}node;

void allocate(node *list){
  if(list == NULL) list = malloc(sizeof(node));
  printf("%p \n",(void *)list); //list da duoc cap phat bo nho o day.
}

void main(void){
  node *list = NULL;
  allocate(list);
  printf("%p \n",(void *)list); // list o day van la NULL??
}

Tại sao vậy ạ? Ở đây em đã truyền con trỏ vào rồi mà sao ra khỏi hàm allocate() thì list vẫn là NULL ạ?

Cấp phát như thường nhé. :slight_smile:

Chỉ là bạn cấp phát sai cách thôi.

Hãy nhớ điều này (đối với C)

Muốn thay đổi giá trị của biến truyền vào mà bên ngoài cũng thay đổi thì phải dùng con trỏ
Muốn thay đổi giá trị của con trỏ truyền vào thì phải dùng con trỏ cấp cao hơn

Do đó bạn phải viết như này:

void allocate(node **list){
  if (*list == NULL) *list = (node*)malloc(sizeof(node));
}

Khi call thì phải pass như vầy:

  node *list = NULL;
  allocate(&list);

Còn viết như bạn là bạn thay đổi giá trị của con trỏ list (bên trong hàm) còn giá trị của con trỏ list bên ngoài hàm vẫn không đổi.

3 Likes

It works!

Thì ra là vậy, ta cần con trỏ cấp cao hơn để cấp phát bộ nhớ.

Cảm ơn vì câu trả lời rất chi tiết. Have a nice day!

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?