01/10/2018, 00:18

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("
");
}
Văn Dương viết 02:25 ngày 01/10/2018

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

Mai Anh Dũng viết 02:29 ngày 01/10/2018

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ử
}
Người bí ẩn viết 02:27 ngày 01/10/2018

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

Mai Anh Dũng viết 02:20 ngày 01/10/2018

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

Người bí ẩn viết 02:33 ngày 01/10/2018

Đú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

Tao Không Ngu. viết 02:22 ngày 01/10/2018

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. @_@!

Nguyễn Đức Anh viết 02:32 ngày 01/10/2018

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

Bài liên quan
0