01/10/2018, 08:18

Check null pointer in C

Chào cả nhà,

Em đang gặp một vấn đề với con trỏ nên nhờ cả nhà ra tay giúp đỡ.
Chuyện là thế này, em có khai báo và cấp phát bộ nhớ cho 1 con trỏ:

int *pointer = malloc(sizeof(pointer) * N);
    if (pointer)
       printf NULL;
    else
       printf NOT NULL;

Kết quả: NOT NULL

Sau một cơ số vòng lặp của code này end program. Em sửa code, không cấp phát bộ nhớ cho nó nữa;

 int *pointer;
            if (pointer)
               printf NULL;
            else
               printf NOT NULL;

Kết quả: NOT NULL

Em đoán là do con trỏ chưa được giải phóng và còn lưu trong RAM nên nó tự nhận diện. Có cách nào giải phóng con trỏ này không ạ (Linux) ?

Nguyễn Duy Hùng viết 10:23 ngày 01/10/2018

Có thể bạn chưa gọi hàm free(pointer) hoặc hệ điều hành không thu hồi khi chưa gọi hàm free kia. Mình nhớ đọc ở đâu đó việc free hay delete bộ nhớ chỉ là chuyển quyền kiểm soát vùng nhớ đó cho một chương trình khác, nếu như chưa có chương trình nào quản lý vùng nhớ do pointer kiểm soát thì nó vẫn thế. Lâu quá không nhớ rõ C/C++ .

Tran Xuan Son viết 10:32 ngày 01/10/2018

Đoạn này theo mình hiểu là bạn khai báo 1 con trỏ mà không gán giá trị nào cho nó cả, rồi sau đó xài thì hơi phiêu

 int *pointer;
            if (pointer)
               printf NULL;
            else
               printf NOT NULL;

int *pointer; Cái này nên gán NULL cho nó nè chứ không là không biết được nó gán giá trị mặt định là bao nhiêu đâu. Với lại code trông giống mã giả quá up mã thiệt lên thì dể xem hơn

yoloh3 viết 10:24 ngày 01/10/2018

Đúng rồi, gán NULL cho nó ban đầu là được :D. Lâu không học bị quên

IT viết 10:24 ngày 01/10/2018

Ở đoạn code thứ nhất con trỏ được cấp phát bằng cơ chế malloc nếu thành công thì trả về địa chỉ ô nhớ cho con trỏ trỏ đến, nếu thất bại thì trỏ về con trỏ NULL. Ở đây đã cấp phát thành công nên in ra NOT NULL.

Ở đoạn code thứ 2 mới chỉ khai báo, chưa cấp phát, nhưng hiện tại nó đang chứa giá trị rác là một địa chỉ ô nhớ nào đó (có thể là ô nhớ mà chương trình khác đang sử dụng) khác NULL, nên khi in ra NOT NULL.

Bài liên quan
0