C 为什么memset不设置所有内存?
我的代码如下所示:C 为什么memset不设置所有内存?,c,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>
#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);
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
字符*mm;
int mem_size=1您正在扫描映射内存的末尾
end = (long *) mm + mem_size;
将mm
转换为long*
。将mem\u size
添加到该指针值会将指针向前推进mem\u size*sizeof(long)
字节
改为:
end = (long *)(mm + mem_size);
您正在扫描映射内存的末尾
end = (long *) mm + mem_size;
将mm
转换为long*
。将mem\u size
添加到该指针值会将指针向前推进mem\u size*sizeof(long)
字节
改为:
end = (long *)(mm + mem_size);
请描述您在内存中的何处得到错误。它是否靠近开始,靠近结束?它是否始终位于相对于内存结束的同一位置?”end=(long*)mm+mem_size;
“为什么将mm
转换为long*
?您的结束将远远超出mmap()
ed的内存。注意:(long*))mm+mem_size
将指向内存末尾以外的内容,因为mem_size将在加法之前乘以long的大小。您可能指的是(long*)(mm+memsize)
.btwPRIx64
用于uint64\u t
,但您使用的是longdescription,它在内存中的何处出现错误。它是否靠近开始,接近结束?它是否始终位于相对于内存结尾的同一位置?end=(long*)mm+mem size;
“为什么要将mm
转换为long*
?你的结尾将远远超出你mmap()
ed的内存。注意:(long*)mm+memu size
将指向内存结尾之外的某个地方,因为mem\u size将在添加之前乘以long的大小。你可能的意思是(long*))(mm+memsize)
.btwPRIx64
用于uint64\u t
,但您正在使用long@EmanueleVannacci:像这样的优先级错误可能很微妙,很难发现;幸运的是,你只浪费了一天时间。如果有疑问,请使用括号。另一个选项是声明long*mm
,然后使用&mm[mem_size]
@emanuelevanacci:像这样的优先级错误可能很微妙,也很难捕捉;幸运的是,你只浪费了一天时间。如果有疑问,请使用括号。另一种选择是声明长*mm
,然后使用&mm[mem_size]