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

  1. Code trên có vấn đề gì?
  2. Làm sao để in ra hello
Nguyễn Minh Dũng viết 18:11 ngày 30/09/2018

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();
}
Dũng Kon viết 18:18 ngày 30/09/2018

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();
}
Nguyễn Minh Dũng viết 18:17 ngày 30/09/2018

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

Dũng Kon viết 18:13 ngày 30/09/2018

ọ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

Tâm Nhật viết 18:15 ngày 30/09/2018

Rất hay. Có thể nói rõ thêm về con trỏ cấp >=2 không anh Đạt?

Nguyễn Minh Dũng viết 18:10 ngày 30/09/2018

Đừ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.

Bài liên quan
0