Vấn đề chính với việc kiểm tra xem một con trỏ có nằm trong phạm vi cụ thể không may là chính tiêu chuẩn C. Con trỏ số học có một hành vi được xác định duy nhất nếu thực hiện trên con trỏ cùng loại trong phạm vi bộ nhớ của cùng một đối tượng (ví dụ trong cùng một phạm vi mảng phân bổ). Một toán tử so sánh được định nghĩa là các phép toán số học, hạn chế này cũng áp dụng cho chúng. Một cách giải quyết cho vấn đề này sẽ là chuyển các con trỏ tới uintptr_t
kiểu được xác định trong stdint.h
, đây là một kiểu số nguyên được đảm bảo để giữ một giá trị con trỏ. Và sau đó thực hiện so sánh của bạn.
Bây giờ đến phần để có được ranh giới đúng. Thông thường, một dự án C sẽ chứa một số loại tập lệnh liên kết xác định vùng nhớ của kiến trúc cụ thể. Thông thường, nó sẽ bao gồm các dòng tương tự như sau:
MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x40000
SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x8000
}
sau đó, trong cùng một kịch bản, các định nghĩa sau có thể được thêm vào:
_flash_start = ORIGIN(FLASH);
_flash_end = ORIGIN(FLASH) + LENGTH(FLASH);
Và sau đó trong mã C, các ký hiệu này có thể được truy cập bằng cách sử dụng:
extern int _flash_start ;
extern int _flash_end;
Và sau đó là một phần khó khăn: Địa chỉ của _flash_start
sẽ tương ứng với địa chỉ bắt đầu flash và địa chỉ của _flash_end
sẽ tương ứng với địa chỉ kết thúc flash. Tức là &_flash_start
và &_flash_end
đang cung cấp cho bạn phạm vi mong muốn.