为什么memset不设置所有内存?

时间:2018-10-15 19:44:26

标签: c

我的代码如下:

#include <assert.h>
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/time.h>
#include <unistd.h>
#include <string.h>

int main()
{
    char *mm;
    int mem_size = 1 << 30;
    long *ptr, *end;

    mm = (char *) mmap(NULL, mem_size, PROT_READ | PROT_WRITE,
                        MAP_ANON | MAP_PRIVATE, -1, 0);
    assert(mm != MAP_FAILED);
    memset(mm, 0xff, mem_size);
    end = (long *) mm + mem_size;

    for(ptr = (long *) mm ; ptr < end ; ptr++){
        if((*ptr) != ~(long)0){
            printf("At %p found 0x%" PRIx64 "\n", ptr, *ptr);
            exit(1);
        }
    }

    exit(0);
}

我将所有内存设置为0xff,以将其填满。我希望打印永远不会执行,但事实并非如此。当我搜索包含设置为零的位的内存区域时,我会在内存区域中找到一个地址。错误在哪里?

1 个答案:

答案 0 :(得分:7)

您正在扫描途中超出映射内存的末尾。

end = (long *) mm + mem_size;

您将mm转换为long*。将mem_size添加到该指针值可以使指针前进mem_size * sizeof (long)个字节。

将其更改为:

end = (long *)(mm + mem_size);