30/09/2018, 19:05
Cho mình hỏi về kiểu con trỏ
Mình có khai báo 1 biến con trỏ int *a=new int[3];
Rồi for(int i=0;i<10;i++){
a[i]=i;
}
thì chương trình không có lỗi gì và khi mình xuất ra cũng không có lỗi có phải con trỏ không liên quan đến kích thước lúc đầu khai báo không ai biết giải thích cho mình với
Bài liên quan
Bạn cứ cho 10 thành 9999999 đi là hiểu, chạy debug thì tràn mảng 1 tí sẽ không báo lỗi.
Tức là làm vậy là không đúng phải không bạn
Chào bạn.
Vùng nhớ khi khai báo động nằm trong bộ nhớ heap.
Khi khai báo *a=new int[3]; thì trình biên dịch tìm trong heap memory 3 * sizeof(int) bytes chưa sử dụng để cấp phát cho mảng a, khi đó a mang giá trị địa chỉ cấp 1. Như vậy a[10] nó vẫn có thể hợp lệ, đó là ô nhớ thứ 11 đếm qua phải từ ô nhớ a trỏ đến. Nhưng có thể nó chưa được sử dụng, cũng có thể nó đang được quản lý bởi con trỏ khác chẳng hạn.
Thank nhé tiện cho mình hỏi luôn mình muốn Malloc con trỏ ở bên hàm khác ví dụ
void LinhTinh(int *&a) thì tại sao lại phải có & ạ mà các phép toán bình thường thì không cần & cũng được
Thử lấy cái hình này và đoạn code bên dưới cho dễ hiểu.
Ideone.com
Ideone.com
Ideone is something more than a pastebin; it's an online compiler and debugging tool which allows to compile and run code online in more than 40 programming languages.
Như kết quả thì khi in ra a, *&a có giá trị giống &value.
Thế nên về mặt cơ bản, cả 3 cái trên đều tham chiếu đến địa chỉ của biến value.
Nhưng khi truyền vào hàm theo kiểu *&a, thì thực chất là thay đổi giá trị value bằng cách thay đổi giá trị mà con trỏ a đang tham chiếu tới.
Thank b nhưng mình vẫn chưa hiểu lắm vì nếu 1 hàm bình thường muốn thay đổi giá trị thì chỉ cần truyền kiểu * như void ThayDoi(int *a,int n) rồi for(int i=0;i<n;i++) a[i]+=1 thì giá trị nó vẫn thay đổi nhưng nếu dùng malloc thì lại phải thêm *&a
vì khi malloc thì giá trị của con trỏ truyền vào có thay đổi, còn các hàm bình thường thì giá trị trong mảng / phần tử mà con trỏ trỏ tới bị thay đổi.
void ThayDoi(int *a,int n)
: chỉ thay đổi được*a
, ko thay đổi đượca
. Khi gọiThayDoi(p, n)
thì ko phải con trỏp
được truyền vào hàm ThayDoi, mà 1 bản copy của p được truyền vào.LinhTinh(int *&a)
: thay đổi được*a
và cảa
. Khi gọiLinhTinh(p)
thì chínhp
được truyền vào LinhTinh. Khi viếta = (int*) malloc(...)
thì giá trị củaa
bị thay đổi. Nếu ko truyền bản chính mà truyền bản copy thì giá trị củap
(hay địa chỉ mà p trỏ tới) ko bị thay đổi, vì chỉ có giá trị bản copy bị thay đổi.trong C/C++ các tham số luôn được truyền vào bản copy. Muốn truyền bản chính (tham chiếu) thì phải viết dấu
&
.http://diendan.congdongcviet.com/threads/t42977::tim-hieu-ban-chat-cua-con-tro-tu-co-ban-den-nang-cao.cpp