Tại sao con trỏ bậc 2 lại không có địa chỉ khi khai báo?

Tại sao con trỏ bậc 2 lại không có địa chỉ khi khai báo? Làm thế nào để khắc phục nó?

int ** a;
int m = 3;
int n = 5;
int iValue = 1;

// Gán giá trị
for (int y = 0; y < m; y++)
{
    for (int x = 0; x < n; x++)
    {
        a[y][x] = iValue ++;
    }
}

// Xuất giá trị
for (int y = 0; y < m; y++)
{
    for (int x = 0; x < n; x++)
    {
        printf("%-5d", a[y][x]);
    }

    printf("\n");
}

Thì đã tạo mới nó hoặc bắt nó chỉ vào đâu đâu mà có địa chỉ ?

con trỏ a bạn tạo ra mà có cấp phát vùng nhớ cho nó đâu. Phải cấp phát vùng nhớ cho nó trước khi xài.

int ** a = (int**)malloc(sizeof(int *) * m); // Cấp phát mảng con trỏ m phần tử - hay m dòng
for(int i = 0; i < m; ++i) {
    a[i] = (int*) malloc(sizeof(int) * n); // cấp phát mảng int n phần tử
}
1 Like

Chưa khởi tạo bộ nhớ mà vẫn gán giá trị bình thường hả ta :neutral_face:

Gán bình thường, có khả năng crash thôi.

Đúng rồi, nhưng hình như khi run xong nó hiện thêm 1 cái bảng to tướng nữa :smile:

Có trình biên dịch gán mặc định bằng null/nullptr/0 có trình biên dịch không gán mặc định mà là một giá trị ngẫu nhiên có trong vùng nhớ đó.
Trước mình có code một cái lib C/C++ chạy trên android. Khi build và test trên pc thì không có vấn đề gì, build test trên android thì crack.
Sau kiểm tra lại là con trỏ trên android không được gán lại bằng null khi tạo nên khi gọi hàm nó kiểm tra và giải phóng vùng nhớ không được phép.
Thói quen tốt là khi khởi tạo gán bằng null.
VD: int **a = nullptr;
Con trỏ bình thường cũng nên gán int *pa = nullptr;

Chúc bạn to đầu với con trỏ trong C. @_@!

2 Likes

Em làm được rồi. Cảm ơn anh ạ :smiley:

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