Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么memset不设置所有内存?_C - Fatal编程技术网

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)
.btw
PRIx64
用于
uint64\u t
,但您使用的是longdescription,它在内存中的何处出现错误。它是否靠近开始,接近结束?它是否始终位于相对于内存结尾的同一位置?
end=(long*)mm+mem size;
“为什么要将
mm
转换为
long*
?你的
结尾将远远超出你
mmap()
ed的内存。注意:
(long*)mm+memu size
将指向内存结尾之外的某个地方,因为mem\u size将在添加之前乘以long的大小。你可能的意思是
(long*))(mm+memsize)
.btw
PRIx64
用于
uint64\u t
,但您正在使用long@EmanueleVannacci:像这样的优先级错误可能很微妙,很难发现;幸运的是,你只浪费了一天时间。如果有疑问,请使用括号。另一个选项是声明
long*mm
,然后使用
&mm[mem_size]
@emanuelevanacci:像这样的优先级错误可能很微妙,也很难捕捉;幸运的是,你只浪费了一天时间。如果有疑问,请使用括号。另一种选择是声明
长*mm
,然后使用
&mm[mem_size]