Giá trị con trỏ null đại diện cho một "hư không" được xác định rõ; nó là một giá trị con trỏ không hợp lệ được đảm bảo để so sánh không bằng với bất kỳ giá trị con trỏ nào khác. Việc cố gắng hủy đăng ký một con trỏ null dẫn đến hành vi không xác định và thường sẽ dẫn đến lỗi thời gian chạy, vì vậy bạn muốn chắc chắn rằng một con trỏ không phải là NULL trước khi cố gắng hủy đăng ký. Một số hàm thư viện C và C ++ sẽ trả về một con trỏ null để chỉ ra một điều kiện lỗi. Ví dụ, hàm thư viện malloc
sẽ trả về giá trị con trỏ null nếu nó không thể phân bổ số byte đã được yêu cầu và cố gắng truy cập bộ nhớ thông qua con trỏ đó (thường) sẽ dẫn đến lỗi thời gian chạy:
int *p = malloc(sizeof *p * N);
p[0] = ...; // this will (usually) blow up if malloc returned NULL
Vì vậy, chúng tôi cần đảm bảo malloc
cuộc gọi thành công bằng cách kiểm tra giá trị của p
NULL:
int *p = malloc(sizeof *p * N);
if (p != NULL) // or just if (p)
p[0] = ...;
Bây giờ, hãy treo tất của bạn một phút, điều này sẽ có một chút gập ghềnh.
Có một con trỏ null giá trị và một con trỏ null liên tục , và cả hai không nhất thiết phải giống nhau. Các con trỏ null giá trị là bất cứ điều gì đánh giá cao việc sử dụng kiến trúc cơ bản để đại diện cho "hư không". Giá trị này có thể là 0x00000000 hoặc 0xFFFFFFFF hoặc 0xDEADBEEF hoặc một cái gì đó hoàn toàn khác. Đừng cho rằng các con trỏ null giá trị luôn luôn là 0.
Hằng số con trỏ null , OTOH, luôn là biểu thức tích phân có giá trị 0. Theo như mã nguồn của bạn , 0 (hoặc bất kỳ biểu thức tích phân nào ước lượng thành 0) đại diện cho một con trỏ null. Cả C và C ++ đều định nghĩa macro NULL là hằng số con trỏ null. Khi mã của bạn được biên dịch, các con trỏ null liên tục sẽ được thay thế bằng con trỏ null phù hợp giá trị trong mã máy tạo ra.
Ngoài ra, hãy lưu ý rằng NULL chỉ là một trong nhiều giá trị con trỏ không hợp lệ có thể có ; nếu bạn khai báo một biến con trỏ tự động mà không khởi tạo nó một cách rõ ràng, chẳng hạn như
int *p;
giá trị được lưu trữ ban đầu trong biến là không xác định và có thể không tương ứng với địa chỉ bộ nhớ hợp lệ hoặc có thể truy cập. Thật không may, không có cách nào (di động) để biết liệu giá trị con trỏ không phải NULL có hợp lệ hay không trước khi thử sử dụng nó. Vì vậy, nếu bạn đang xử lý các con trỏ, thông thường nên khởi tạo rõ ràng chúng thành NULL khi bạn khai báo chúng và đặt chúng thành NULL khi chúng không chủ động chỉ vào bất cứ thứ gì.
Lưu ý rằng đây là một vấn đề trong C hơn là C ++; C ++ thành ngữ không nên sử dụng con trỏ nhiều như vậy.