30/09/2018, 16:03
Cùng đặt vấn đề nào( Bản số 3)
#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();
}
Có 2 câu hỏi là:
- Code trên có vấn đề gì?
- Làm sao để in ra hello
Bài liên quan
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ủaq
là truyền vào chứ không phải làq
. Các thao tác bên trong hàmmyfunction
sẽ vô tác dụng vớip
ở bên hàmmain
.Điều này dẫn đến dù ta có cấp phát vùng nhớ cho
q
bên trongmyfunciont
đi chăng nữa thìp
ở hàmmain
cũng không nhận được gì. Vìp
ở hàm main chưa bao giờ chui vào trongmyfunction
.Để 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ủap
ở hàmmain
được gửi vào trongmyfucntion
thì các thay đổi trên*q
sẽ được áp dụng vàop
. Đó 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.Và trong C++ có một thứ gọi là tham chiếu, đơn giản nhẹ nhàng hơn nhiều
Hợp lý, trong C sử dụng tham chiếu để giải quyết vấn đề này. Tức là thay vì truyền địa chỉ mà
p
ở hàm main đang giữ. Ta truyền luônp
vào trong hàmmyfunction
bằng cách sử dụng tham chiếu, tức dấu&
. Khi đó các thay đổi trênq
trong hàmmyfunction
sẽ được áp dụng lênp
ở hàmmain
. Tuy nhiên code của @Dung_Kon chưa chính xác lắm.Chú ý, khái niệm reference(tham chiếu) chỉ có trong C++. C không có khái niệm reference(tham chiếu).
ọc ọc. em copy bài anh rồi sửa lại nên có vài nhầm lẫn, không có vấn đề gì ? hehe
Rất hay. Có thể nói rõ thêm về con trỏ cấp >=2 không anh Đạt?
Đừng quan tâm đến con trỏ > 2. Con trỏ cấp 2 là đủ dùng rồi. Thêm nữa rối lắm. Trước đây Đạt có làm một số công việc lên quan đến con trỏ cấp > 2. Nói chung là đọc code rối mắt lắm.