我试图使用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'?也许你没有切换全部的警告? “墙”可以告诉你更多。 –