Con trỏ NULL
Thuộc phần Logic và luồng điều khiển trong hành trình C của Coddy. Bài học 5 trên 63.
Đôi khi bạn cần khai báo một con trỏ nhưng chưa có địa chỉ bộ nhớ hợp lệ để gán cho nó ngay. Trong những trường hợp này, bạn cần khởi tạo con trỏ bằng một giá trị đặc biệt có tên là NULL.
Con trỏ NULL là con trỏ không trỏ đến địa chỉ bộ nhớ hợp lệ nào. Trong C, NULL thường được định nghĩa là 0 hoặc (void*)0. Khi khởi tạo con trỏ bằng NULL, bạn đang nêu rõ rằng hiện tại nó không trỏ đến bất kỳ thứ gì hữu ích.
int *ptr = NULL; // Khởi tạo con trỏ với NULL
printf("%p", ptr); // Lệnh này sẽ in ra 0 hoặc (nil)Khởi tạo con trỏ bằng NULL được xem là một thực hành lập trình tốt vì việc này ngăn con trỏ chứa các giá trị rác ngẫu nhiên. Một con trỏ chưa được khởi tạo có thể chứa bất kỳ địa chỉ bộ nhớ ngẫu nhiên nào, dẫn đến hành vi không thể đoán trước nếu bạn vô tình sử dụng nó.
Bạn có thể kiểm tra xem con trỏ có phải là NULL hay không trước khi sử dụng, điều này giúp ngăn chương trình bị lỗi và làm cho code của bạn đáng tin cậy hơn. Việc kiểm tra an toàn này càng quan trọng khi chương trình của bạn trở nên phức tạp hơn.
Thử thách
DễViết chương trình C minh họa cách khởi tạo và kiểm tra con trỏ NULL đúng cách. Chương trình của bạn cần:
- Khai báo con trỏ đến số nguyên có tên
safe_ptrvà khởi tạo nó thành NULL - Khai báo con trỏ đến ký tự có tên
char_ptrvà khởi tạo nó thành NULL - Kiểm tra xem
safe_ptrcó phải là NULL hay không bằng câu lệnh if và in ra "safe_ptr is NULL" nếu đúng - Kiểm tra xem
char_ptrcó phải là NULL hay không bằng câu lệnh if và in ra "char_ptr is NULL" nếu đúng - In địa chỉ bộ nhớ được lưu trong
safe_ptrbằngprintfvới định dạng%p - In địa chỉ bộ nhớ được lưu trong
char_ptrbằngprintfvới định dạng%p
Đầu ra của bạn cần hiển thị kết quả theo định dạng sau:
safe_ptr is NULL
char_ptr is NULL
safe_ptr address: [address]
char_ptr address: [address]Địa chỉ bộ nhớ thực tế sẽ hiển thị là 0, (nil) hoặc một cách biểu diễn NULL tương tự, tùy thuộc vào hệ thống của bạn, nhưng định dạng và nhãn phải khớp chính xác như trên.
Tự làm thử
#include <stdio.h>
int main() {
// TODO: Viết code của bạn ở đây
// Khai báo và khởi tạo các con trỏ
// Kiểm tra xem các con trỏ có bằng NULL không
// In ra đầu ra theo yêu cầu
return 0;
}Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng điều khiển
1Nền tảng về con trỏ
Con trỏ là gì?Khai báo con trỏToán tử lấy địa chỉ (&)Toán tử giải tham chiếu (*)Con trỏ NULLÔn tập: kiến thức cơ bản về con trỏ4Dự án: Công cụ xử lý văn bản đơn giản
Tổng quan dự ánĐếm ký tự2Con trỏ và mảng
Tên mảng dưới dạng con trỏPhần tử mảng và con trỏPhép toán con trỏSo sánh con trỏÔn tập: duyệt mảng bằng con trỏ5Con trỏ và hàm
Truyền theo giá trịTruyền con trỏ vào hàmSửa đổi biến qua con trỏVí dụ kinh điển: hoán đổiTruyền mảng vào hàmÔn tập: đối số con trỏ hàm3Mảng ký tự và chuỗi
Chuỗi dưới dạng mảng charKý tự kết thúc nullNhập chuỗi bằng scanfDùng strlen()Dùng strcpy()Dùng strcat()Dùng strcmp()Ôn tập: các hàm xử lý chuỗi cơ bản6Quản lý bộ nhớ
Bộ nhớ ngăn xếp và bộ nhớ heapCấp phát động với malloc()Dùng sizeof() để cấp phátKiểm tra lỗi cấp phátGiải phóng bộ nhớ với free()Cấp phát với calloc()Ôn tập: Mảng động9Dự án: Nhập thông tin liên hệ đơn giản
Định nghĩa struct ContactHàm tạo liên hệTự luyện tập: Trình biên dịch C online