01/10/2018, 15:59
Làm sao để truyền giá trị của mảng cấp phát động vào hàm?
Mình thử truyền cấp phát động 2 mảng a, b vào hàm.
#include <iostream>
using namespace std;
int *a;
int *b;
void enter(int *c,int *d)
{
c=new int[3];
d=new int[3];
}
int main()
{
enter(a,b);
}
Nhưng sau khi truyền xong, a, b vẫn giữ nguyên con trỏ null, mình đã mò mấy ngày nhưng chưa biết phải làm sao
Bài liên quan
Mình nhớ mình có gặp và có trả lời về vấn đề tương tự trên daynhauhoc rồi, nhưng không nhớ chỗ nào để tìm lại cho bạn. Trước đây mình cũng từng bị lỗi này vì không hiểu rõ cách C gọi hàm và con trỏ.
Bạn có thể hiểu đơn giản là truyền con trỏ vào hàm chỉ là truyền địa chỉ vùng nhớ (chỉ là 1 con số 4 bytes với 32bit và 8 bytes với 64bit). Và khi bạn dùng
new
haymalloc
, nó sẽ yêu cầu hệ điều hành cấp phát một vùng nhớ tương ứng, và vùng nhớ này sẽ có địa chỉ khác với địa chỉ vùng nhớ ban đầu của nó.Khi khai báo con trỏ
*a
, nó nhất định sẽ trỏ tới đâu đó có địa chỉ tạm gọi là0xA
, khi truyền vào hàm (như ví dụ của bạn) thì giá trị truyền vào là0xA
, biến nội bộ tên làc
sẽ giữ giá trị này, rồi bạn xin thêm vùng nhớ quanew
, HĐH trả về vùng nhớ0xC
và biếnc
giữ giá trị này, giờ thì nó đã ghi đè vào biếnc
, biếnc
không còn biết tới vùng nhớ có địa chỉ0xA
nữa. Mọi thao tác bây giờ xung quanh đến vùng nhớ0xC
và vùng nhớ ban đầu0xA
của biếna
không bị tác động đến. Nên biếna
bình tĩnh sống, hàm đó không ảnh hưởng gì đến nó cả.Giống như thế này:
Vậy, nó khá là vô nghĩa. Giá trị truyền vào không được sử dụng.
Giải quyết:
enter
nhưng điều này là xấu và mình không khuyến khích.Hi Tran Nhu Thanh.
Cái này liên quan đến tham chiếu tham trị. Với C++ bạn có thể dùng tham chiếu.
Nhưng mình không biết làm sao để tham chiếu con trỏ hết ?
Thêm
&
trước tên khi khai báo tham sốMình đã thử trước khi đăng topic này rồi
bạn dùng pointer to pointer như thế này thử xem sao.
Mình thử được rồi, thanks bạn nhiều