gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:00:46 26 4
gpt4 key购买 nike

每当我将结构加载到内存中时,内存块似乎在某些字节之前包含 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com