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();
}