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ủaqlà truyền vào chứ không phải làq. Các thao tác bên trong hàmmyfunctionsẽ 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
qbên trongmyfunciontđi chăng nữa thìpở hàmmaincũ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
pvào, thay vì gửi địa chỉ màpđang giữ. Khi địa chỉ củapở hàmmainđược gửi vào trongmyfucntionthì các thay đổi trên*qsẽ đượ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ônpvào trong hàmmyfunctionbằng cách sử dụng tham chiếu, tức dấu&. Khi đó các thay đổi trênqtrong hàmmyfunctionsẽ đượ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.