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à:

  1. Code trên có vấn đề gì?
  2. Làm sao để in ra hello
2 Likes

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

Và trong C++ có một thứ gọi là tham chiếu, đơn giản nhẹ nhàng hơn nhiều

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

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ôn p vào trong hàm myfunction bằng cách sử dụng tham chiếu, tức dấu &. Khi đó các thay đổi trên q trong hàm myfunction sẽ được áp dụng lên p ở hàm main. Tuy nhiên code của @Dung_Kon chưa chính xác lắm.

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

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).

2 Likes

ọ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

1 Like

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.

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