C /dev/uradom向mmap()提供随机地址

C /dev/uradom向mmap()提供随机地址,c,linux,posix,C,Linux,Posix,在调用函数4次后,即使使用/dev/uradom,我仍然会得到相同的地址位置。为什么呢?为什么/dev/uradom提供的数字很低还是很高 104 0x7fffb128de78 0x7f9e3c565000 4294967192 0x7fffb128de78 0x7f9e3c564000 97 0x7fffb128de78 0x7f9e3c563000 4294967139 0x7fffb128de78 0x7f9e3c562000 因为你把指针的值和地址搞混了。您想使用p,而不是&p。此外,t

在调用函数4次后,即使使用/dev/uradom,我仍然会得到相同的地址位置。为什么呢?为什么/dev/uradom提供的数字很低还是很高

104 0x7fffb128de78 0x7f9e3c565000 4294967192 0x7fffb128de78 0x7f9e3c564000 97 0x7fffb128de78 0x7f9e3c563000 4294967139 0x7fffb128de78 0x7f9e3c562000
因为你把指针的值和地址搞混了。您想使用
p
,而不是
&p
。此外,temp char数组是无用的,您将它复制到around是不正确的。更正后的代码应为:

void test(void){
    void *p;
    int filedescriptor = open("/dev/urandom", O_RDONLY);
    read(filedescriptor, &p, sizeof p);
    close(filedescriptor);

    char *x = (char *)mmap(p, 1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    printf("%p\n", x);
}

我已添加到您的代码中。mmap()将忽略8字节(64位)内存地址,因为当前不可能有2^64 RAM。必须将4个字节归零,以便mmap()将应用提示。@elaine:传递给
mmap
的地址应该只是一个提示,除非使用
MAP\u FIXED
,所以我觉得奇怪的是,内核无法修复它以满足它的任何要求。然而,根本没有必要这样做。内核在某种程度上自动随机化
mmap
位置,使用
mmap
的非零地址是不可移植的。我添加的代码似乎被同行评审删除了。我所能说的就是测试它。如果没有我的编辑,mmap()将忽略64位系统上的提示;对于我的代码,mmap()将使用它。(我在4GB内存的桌面电脑上使用Debian wheezy Linux x64。)我认为编辑被拒绝并不是因为内容,而是因为编辑答案而不是讨论评论中的错误在这个网站上被认为是不合适的。非作者编辑通常应保留用于修正打字错误或明显的错误陈述、修正格式(而非内容)、删除离题的冒犯性评论,或者在回答非常糟糕且带有有害建议的情况下,添加“编辑注释”,说明该建议有害。如果答案不完整或您认为需要更改,则评论是讨论该问题的合适场所。
void test(void){
    void *p;
    int filedescriptor = open("/dev/urandom", O_RDONLY);
    read(filedescriptor, &p, sizeof p);
    close(filedescriptor);

    char *x = (char *)mmap(p, 1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    printf("%p\n", x);
}