我試圖使用mmap分配內存,這裏是代碼:MMAP分配收益0xfffffffffffffff4(不MAP_FAILED)
long long *copy;
copy = (long long*)mmap(NULL,
(size_t)1024,
PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_PRIVATE | MAP_ANON, -1, 0);
if (copy == MAP_FAILED) {
fprintf(stderr, "Memory allocation failed (Process aborted)\n");
exit(1);
}
printf("Pointer: %p\n", copy);
很顯然,我檢查,如果分配失敗。當發生這種情況時,我應該從man pages收集到-1。事情是我得到-12,以及0xfffffffffffffff4
,所以錯誤沒有被捕獲,程序繼續。我想也許是因爲(long long*)
強制轉換,但是強制轉換不應該改變指針值。所以我很好奇爲什麼會發生這種情況以及如何防止它發生。
更奇怪的行爲:
我試圖打印errno
。如果我使用printf("%d\n", errno);
它打印0,指針仍然設置爲0xfffffffffffffff4
。但是,如果使用err(errno, "%p", copy);
然後它打印:
program.exe: 0x7f8130981000: Success
而現在的指針是有效的,但我不能使用它,因爲err
終止執行。
'program.exe' - 你在Windows上嗎?你正在使用MinGW或Cygwin或其他? –
不,我可以看到如何可以誤導,我在Linux上,但我指定.exe擴展爲組織目的 – Hadron
您的問題可能是'mmap'返回的轉換。在C中,這是不必要的,可以隱藏錯誤。也許你忘了'#include'?也許你沒有切換全部的警告? 「牆」可以告訴你更多。 –