我的代码如下:
#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,以将其填满。我希望打印永远不会执行,但事实并非如此。当我搜索包含设置为零的位的内存区域时,我会在内存区域中找到一个地址。错误在哪里?
答案 0 :(得分:7)
您正在扫描途中超出映射内存的末尾。
end = (long *) mm + mem_size;
您将mm
转换为long*
。将mem_size
添加到该指针值可以使指针前进mem_size * sizeof (long)
个字节。
将其更改为:
end = (long *)(mm + mem_size);