WhozCraig đã viết những nhận xét này thành answer hiện đã bị xóa, nhưng nó có thể được thăng thành câu trả lời đầy đủ (và đó là những gì tôi đã làm ở đây). Ông lưu ý:
Thú vị lưu ý: AS/400 là một nền tảng rất độc đáo nơi bất kỳ phi hợp lệ con trỏ được coi là tương đương với NULL
. Các cơ chế mà họ sử dụng để làm điều này chỉ đơn giản là tuyệt vời. "Hợp lệ" theo nghĩa này là bất kỳ con trỏ 128 bit nào (nền tảng sử dụng không gian địa chỉ tuyến tính 128bit cho mọi thứ) chứa một "giá trị" thu được bởi một bộ chỉ lệnh đã được tin cậy. Khó tin tưởng, int *p = (int *)1; if (p) { printf("foo"); }
sẽ không in "foo" trên nền tảng đó. Giá trị được gán cho p không phải là nguồn đáng tin cậy và do đó được coi là "không hợp lệ" và do đó tương đương với NULL
.
Thật đáng ngạc nhiên khi nó hoạt động như thế nào. Mỗi đoạn 16 byte trong không gian địa chỉ ảo được ánh xạ của một tiến trình có một bit "tương ứng" trong một bitmap toàn bộ quá trình. Tất cả các con trỏ phải nằm trên một trong những ranh giới đoạn này. Nếu bit được "sáng", con trỏ tương ứng được lưu trữ từ một nguồn đáng tin cậy, nếu không nó sẽ không hợp lệ và tương đương với NULL. Các cuộc gọi đến malloc, toán tử con trỏ, vv, tất cả đều được xem xét kỹ lưỡng trong việc xác định xem bit đó có được thắp sáng hay không. Và như bạn có thể tưởng tượng, việc đưa con trỏ vào các cấu trúc mang đến một thế giới hoàn toàn mới bị tổn thương về ý tưởng đóng gói cấu trúc.
này được đánh dấu cộng đồng wiki (nó không phải là câu trả lời của tôi - tôi không nên lấy tín dụng) nhưng nó có thể bị xóa nếu WhozCraig viết câu trả lời của riêng mình.
Điều này cho thấy rằng có những nền tảng thực với các thuộc tính con trỏ thú vị.
Đã có nền tảng nơi #define NULL ((void *)0)
không phải là định nghĩa thông thường; trên một số nền tảng, nó có thể chỉ là 0
, trên các nền tảng khác, 0L
hoặc 0ULL
hoặc các giá trị thích hợp khác miễn là trình biên dịch hiểu nó. C++ không thích ((void *)0)
như một định nghĩa; các hệ thống mà các tiêu đề tương tác với C++ cũng có thể không sử dụng phiên bản con trỏ void.
Tôi đã học C trên máy nơi đại diện cho địa chỉ char *
cho vị trí bộ nhớ đã cho khác với địa chỉ int *
cho cùng một vị trí bộ nhớ. Đây là trong những ngày trước void *
, nhưng điều đó có nghĩa là bạn phải có malloc()
được khai báo chính xác (char *malloc();
- không có nguyên mẫu), và bạn phải gán giá trị trả về cho đúng loại hoặc bạn có các vùng lõi. Hãy biết ơn đối với tiêu chuẩn C (mặc dù máy được đề cập đến, một ICL Perq - phần cứng bị lỗi từ Three Rivers - phần lớn bị thay thế bởi thời gian tiêu chuẩn được xác định).
Nguồn
2013-04-20 20:13:20
Bạn có thể sử dụng '0' thay vì' NULL'. – pmg
NULL được định nghĩa trong 'stddef.h', bạn không phải tự định nghĩa nó. – Mat
@pmg 0 không phải là di động nếu câu trả lời cho câu hỏi đầu tiên của tôi là đúng – stdcall