Ồ, tốt thôi.
Về mặt kỹ thuật, có, bạn có thể. Trong các thiết bị nhúng không sử dụng MMU hoặc bất kỳ hình thức bảo vệ nào (hoặc bạn biết, x86 ở chế độ thực), bạn có thể thực hiện chính xác những gì bạn đã đăng ở đó. Bạn cũng có thể làm điều đó trong chế độ người dùng trên bất kỳ hệ điều hành nào, nhưng cơ hội bạn thực sự nhấn vào bộ nhớ hợp lệ là rất nhỏ.
Trong thực tế, không, bạn không thể làm điều đó. Với bộ nhớ ảo và bảo vệ bộ nhớ, rất có khả năng vùng bạn cố truy cập sẽ không được ánh xạ và do đó, sẽ thất bại. Ngoài ra, nếu bạn nhấn vào bộ nhớ được bảo vệ (ví dụ: bất kỳ thứ gì thuộc hệ điều hành), quyền truy cập của bạn sẽ không thành công. Cả hai kịch bản này là nguyên nhân gây ra lỗi phân đoạn.
Tuyên bố của bạn hợp lệ (đối với các định nghĩa khác nhau hợp lệ) và chương trình sẽ cố gắng truy cập vào bộ nhớ bạn đã yêu cầu. Nó chỉ là nó có thể không thực sự được ánh xạ tới bất cứ điều gì.
Điều đáng lưu ý là đây là cách hoạt động của I/O được ánh xạ bộ nhớ. Nói rằng tôi có một thanh ghi điều khiển phần cứng khi được ghi vào, viết một byte trên dòng UART/nối tiếp (và, để đơn giản, nó hoạt động như ma thuật và không cần bất kỳ thanh ghi nào khác được thiết lập). Trong C, điều này sẽ được viết như sau cho thiết bị quá đơn giản của tôi:
#define UART1_OUT 0xFC56
volatile char* uart = UART1_OUT; // Definition of pointer to variable.
// volatile is required here. Look it up, but
// it basically stops your compiler optimising
// anything to do with this variable
*uart = 'A'; // Write an A character to the serial line
Tất nhiên, các thiết bị thực tế phức tạp hơn một chút;).
Bạn có thể tìm thấy một số thông tin thú vị tại một câu hỏi khác trên ngăn xếp tràn: http://superuser.com/questions/189876/how-os-detects-memory-access-violations – fycth
Wow, cảm ơn tất cả các câu trả lời tuyệt vời. Tôi nhớ cố gắng học C trở lại trường trung học (khoảng 10 năm trước bây giờ tôi đoán) và tôi dường như nhớ lại rằng vào thời điểm tôi đang dabbling, thường có một không gian bộ nhớ và các vấn đề có thể xảy ra bên trong nó. Thật tốt khi thấy có nhiều sự bảo vệ tại chỗ hơn cho những noobs cấp thấp như bản thân tôi. –
Lưu ý phụ, '% s' là chuỗi định dạng sai cho một ký tự đơn, bạn cần'% c';) – slugonamission