Trong C, NULL là một hằng số tượng trưng luôn trỏ đến một điểm không tồn tại trong bộ nhớ. Mặc dù nhiều lập trình viên coi nó bằng 0, nhưng đây là một sự đơn giản hóa có thể giúp bạn cải thiện sau này. Tốt nhất là kiểm tra trực tiếp con trỏ của bạn so với NULL và sử dụng 0 trong các ngữ cảnh khác. Điều này giúp mã của bạn sạch sẽ và dễ hiểu, vì bạn sẽ biết mình đang làm việc với con trỏ mỗi khi bạn thấy NULL.
Các bước
Phần 1/2: Thực hiện Kiểm tra Null
Bước 1. Sử dụng mã kiểm tra null tiêu chuẩn
Sau đây là cách rõ ràng nhất để viết kiểm tra null. Chúng tôi sẽ sử dụng ptr trong bài viết này là tên của con trỏ bạn đang kiểm tra.
-
nếu (ptr == NULL)
{
// mã nếu con trỏ là NULL
} khác {
// mã nếu không phải NULL
}
Bước 2. Kiểm tra bất kỳ giá trị nào trừ giá trị NULL
Đôi khi thay vào đó, việc kiểm tra sự bất bình đẳng sẽ thuận tiện hơn. Không có gì ngạc nhiên ở đây:
-
if (ptr! = NULL) {
// mã nếu không phải NULL
}
Bước 3. Viết NULL trước để tránh lỗi (tùy chọn)
Nhược điểm chính đối với phương thức PTR == NULL là khả năng bạn sẽ vô tình nhập ptr = NULL thay vào đó, gán giá trị NULL cho con trỏ đó. Điều này có thể gây ra một cơn đau đầu lớn. Vì kiểm tra đẳng thức (trong) xử lý các toán hạng một cách đối xứng, bạn có thể nhận được chính xác cùng một kết quả bằng cách viết nếu (NULL == ptr) thay thế. Điều này có khả năng chống lỗi đánh máy cao hơn, vì NULL = ptr tình cờ tạo ra một lỗi biên dịch đơn giản.
Điều này có vẻ hơi khó xử đối với một số lập trình viên, nhưng nó hoàn toàn hợp lệ. Cách tiếp cận bạn sử dụng chỉ phụ thuộc vào sở thích cá nhân và trình biên dịch của bạn phát hiện lỗi if (ptr = NULL) tốt như thế nào
Bước 4. Kiểm tra xem biến có đúng không
Một đơn giản nếu (ptr) kiểm tra xem ptr là TRUE. Nó sẽ trả về FALSE nếu ptr là NULL hoặc nếu ptr là 0. Trong nhiều trường hợp, sự khác biệt không quan trọng, nhưng hãy lưu ý rằng chúng không giống nhau trong tất cả các kiến trúc.
Mặt trái của điều này là nếu (! ptr), sẽ trả về TRUE nếu ptr là FALSE.
Phần 2 của 2: Tránh sai lầm
Bước 1. Đặt một con trỏ trước khi kiểm tra NULL
Một sai lầm phổ biến là giả định rằng một con trỏ mới được tạo có giá trị NULL. Đây không phải là sự thật. Một con trỏ chưa được gán vẫn trỏ đến một địa chỉ bộ nhớ, chỉ không phải là địa chỉ mà bạn đã chỉ định. Thông thường, bạn nên đặt các con trỏ mới được tạo hoặc mới được giải phóng thành NULL để đảm bảo rằng bạn không vô tình sử dụng địa chỉ không hữu ích này.
-
Tránh sai lầm này:
char * ptr;
nếu (ptr == NULL)
{
// Điều này sẽ trả về FALSE. Con trỏ đã được gán một giá trị hợp lệ.
}
-
Thay vào đó hãy viết:
char * ptr = NULL; // Điều này chỉ định con trỏ cho NULL
nếu (ptr == NULL)
{
// Điều này sẽ trả về TRUE nếu con trỏ chưa được gán lại.
}
Bước 2. Chú ý đến các hàm có thể trả về NULL
Nếu một hàm có thể trả về NULL, hãy nghĩ xem đây có phải là khả năng xảy ra hay không và liệu điều đó có gây ra sự cố sau này trong mã của bạn hay không. Đây là một ví dụ về hàm malloc sử dụng kiểm tra null (nếu (ptr)) để đảm bảo nó chỉ xử lý các con trỏ có giá trị hợp lệ:
-
int * ptr = malloc (N * sizeof (int));
nếu (ptr) {
int i;
cho (i = 0; i <N; ++ i)
ptr = i;
}
Bước 3. Hiểu rằng NULL là 0 nhưng bạn nên luôn sử dụng NULL thay vì 0 khi làm việc với con trỏ cho rõ ràng
Trong lịch sử, C đại diện cho NULL là số 0 (nghĩa là 0x00). Ngày nay, nó có thể phức tạp hơn một chút và thay đổi theo hệ điều hành. Bạn thường có thể kiểm tra NULL bằng cách sử dụng ptr == 0, nhưng có những trường hợp góc mà điều này có thể gây ra sự cố. Có lẽ quan trọng hơn, việc sử dụng NULL giúp hiển nhiên rằng bạn đang làm việc với các con trỏ để người khác đọc mã của bạn.