O mój, dobrze.
Technicznie, tak, możesz. W urządzeniach wbudowanych, które nie korzystają z MMU lub jakiejkolwiek formy ochrony (lub, wiesz, x86 w trybie rzeczywistym), możesz zrobić dokładnie to, co tam zamieściłeś. Możesz także zrobić to w trybie użytkownika w dowolnym systemie operacyjnym, ale szanse na trafienie w prawidłową pamięć są bardzo małe.
W rzeczywistości nie, nie można tak po prostu zrobić. Biorąc pod uwagę pamięć wirtualną i ochronę pamięci, jest bardzo prawdopodobne, że region, do którego próbujesz uzyskać dostęp, nie został zmapowany, a zatem nie powiedzie się. Ponadto, jeśli trafisz na pamięć chronioną (np. Wszystko, co należy do systemu operacyjnego), twój dostęp się nie powiedzie. Oba te scenariusze powodują błędy segmentacji.
Twoje oświadczenie jest ważne (dla różnych definicji ważnych), a program spróbuje uzyskać dostęp do żądanej pamięci. Chodzi o to, że w rzeczywistości nie można go zmapować na nic.
Warto również zauważyć, że tak działa pamięć I/O z mapowaniem pamięci. Załóżmy, że mam rejestr kontroli sprzętu, który po zapisaniu, zapisuje bajt na dołączonej linii UART/serial (i dla uproszczenia działa jak magia i nie wymaga ustawiania innych rejestrów). W C, to byłoby napisane w następujący sposób dla mojego nadmiernie uproszczonego urządzenia:
#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
Oczywiście, urządzenia rzeczywistego świata są nieco bardziej skomplikowane).
Możesz znaleźć interesujące informacje na inne pytanie dotyczące przepełnienia stosu: http://superuser.com/questions/189876/how-os-detects-memory-access-violations – fycth
Wow, dzięki za wszystkie wspaniałe odpowiedzi. Pamiętam, jak próbowałem nauczyć się powrotu do liceum (około 10 lat temu, jak sądzę) i wydaje mi się, że pamiętam, że w czasie, gdy się bawiłem, zwykle istniało jedno miejsce w pamięci i mogły się w nim pojawić problemy. Dobrze jest widzieć, że teraz jest więcej ochrony dla noobów niskiego poziomu, takich jak ja. –
Nota boczna, '% s' jest nieprawidłowym łańcuchem formatu dla pojedynczego znaku, potrzebujesz'% c';) – slugonamission