c++ - Malloc/VirtualAlloc 在 127 dec 之后预置 FFFFFF

标签 c++ c memory visual-studio-2015 malloc

每当我将结构加载到内存中时,内存块似乎在某些字节之前包含 ffffff 。经过仔细检查,我发现这恰好发生在 0x80(12 月的 128)。

#include <Windows.h>
#include <stdio.h>

typedef struct __tagMYSTRUCT {
    BYTE unused[4096];
} MYSTRUCT, *PMYSTRUCT;

int main() {
    MYSTRUCT myStruct;

    for (int i = 0; i < 4094; i++) {
        myStruct.unused[i] = 0x00;
    }

    myStruct.unused[4094] = 0x7F; /* No FFFFFF prepend */
    myStruct.unused[4095] = 0x80; /* FFFFFF prepend */ 

    MYSTRUCT *p = (MYSTRUCT*)malloc(4096);
    *p = myStruct;

    char *read = (char*)p;
    for (int i = 0; i < 4096; i++) {
        printf("%02x ", read[i]);
    }

    free(p);
    p = NULL;
    read = NULL;

    return 0;
}

任何人都知道为什么会发生这种情况和/或如何“修复”它? (我假设字节应该达到0xff);如果我将这些字节写入文件,如 fwrite(&myStruct, sizeof(myStruct), 1, [filestream]) 所示,它不包含 ffffff

使用的编译器:Visual Studio 2015 社区

附注正如标题中所述,使用 VirtualAlloc

时也会发生同样的情况

最佳答案

这与VirtualAllocmalloc无关。

请注意,以下详细信息取决于您的平台,并且不同的操作系统或编译器上可能会发生不同的情况:

char 是有符号类型(在您的平台上)。它的范围是 -128 到 127。当您将数字 128 视为 char 时,它会回绕并实际存储为 -128。

%02x 告诉 printf 以十六进制打印一个 unsigned int,至少有两位数字。但您实际上传递的是一个char。编译器会自动将其转换为 int(值为 -128),printf 随后会将其误解为 unsigned int。在您的平台上,-128 转换为无符号整数将给出与 0xffffff80 相同的值。

关于c++ - Malloc/VirtualAlloc 在 127 dec 之后预置 FFFFFF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40190396/

相关文章:

c++ - C++是否允许函数在参数不足的情况下调用自身?

在 C 中将 32 位和 64 位数字转换为 IEEE 754 二进制

c - 从 .log 文件读取十六进制数据时出错

c++ - 是否可以对任何语句字符串使用准备好的语句?

c++ - 有多少个模板实例化?

c - 在 win32 中调整组合框的大小(更改宽度)

delphi - TClientDataSet 不释放内存

javascript - 函数在内存中的大小

MYSQL InnoDB :why performance after increasing the buffer pool size isn't even close to the MEMORY engine?

c++ - 以毫秒为单位获取自纪元以来的时间,最好使用 C++11 chrono