每当我将结构加载到内存中时,内存块似乎在某些字节之前包含 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
最佳答案
这与VirtualAlloc
和malloc
无关。
请注意,以下详细信息取决于您的平台,并且不同的操作系统或编译器上可能会发生不同的情况:
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/