Có phải con trỏ không liên quan đến kích thước lúc đầu khai báo?

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

2 Likes

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.

1 Like

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.

#include <iostream>
using namespace std;

int main() {
    // your code goes here
    
    int value = 5;
    
    int *a = &value;
    
    cout << &value << endl;
    
    cout << &a << endl;
    cout << a << endl;
    cout << *&a << endl;
    
    return 0;
}

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.

2 Likes

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 được a. Khi gọi ThayDoi(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ọi LinhTinh(p) thì chính p được truyền vào LinhTinh. Khi viết a = (int*) malloc(...) thì giá trị của a bị thay đổi. Nếu ko truyền bản chính mà truyền bản copy thì giá trị của p (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 &.

4 Likes

http://diendan.congdongcviet.com/threads/t42977::tim-hieu-ban-chat-cua-con-tro-tu-co-ban-den-nang-cao.cpp

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