Có vấn đề luôn, vấn đề bự, nhiều bạn sai cái này.
Vì C truyền giá trị chứ không truyền biến vào hàm. Nên trong hàm void myfunction(char *q)
chỉ có địa chỉ của q
là truyền vào chứ không phải là q
. Các thao tác bên trong hàm myfunction
sẽ vô tác dụng với p
ở bên hàm main
.
Điều này dẫn đến dù ta có cấp phát vùng nhớ cho q
bên trong myfunciont
đi chăng nữa thì p
ở hàm main
cũng không nhận được gì. Vì p
ở hàm main chưa bao giờ chui vào trong myfunction
.
Để giải quyết vấn đề này thì ta dùng con trỏ cấp hai. Tức là ta gửi địa chỉ của p
vào, thay vì gửi địa chỉ mà p
đang giữ. Khi địa chỉ của p
ở hàm main
được gửi vào trong myfucntion
thì các thay đổi trên *q
sẽ được áp dụng vào p
. Đó là lý do ta cần con trỏ cấp hai khi cấp phát vùng nhớ cho một con trỏ ở một hàm khác.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void myfunction(char **q){
*q = (char*)malloc(8);
memcpy (*q ,"hello", 6);
}
int main(){
char *p;
myfunction(&p);
printf(p);
getchar();
}