我继承了完全以32位运行的代码,但是当我将编译器更改为64位时,如果运行代码,则会出错。如果我执行代码,它(几乎总是)只是稍后失败。代码中有很多指针,C ++不是我强大的套件。是否有人可以了解错误发生的原因?
我需要了解的是:首先创建BYTE ***,然后是BYTE **, 和 BYTE *永远不会被分配给。我不明白这是如何工作的。我认为BYTE *会被分配到第一个,然后是BYTE **,然后是BYTE ***。为什么这适用于x86,而不适用于x64?
void* AllocMemory(SIZE_T dwBYTEs)
{
void* result;
if (dwBYTEs > 0)
{
result = malloc(dwBYTEs);
if (result != NULL)
return result;
}
return 0;
}
BYTE** CreateBytes(int arg_0, int arg_4, int arg_8)
{
BYTE** hedi = (BYTE**)AllocMemory(arg_0 * 4);
if (!hedi)return 0;
hedi[0] = (BYTE*)AllocMemory(arg_0 * arg_8 * arg_4);
if (!hedi[0]) {
delete(hedi);
return 0;
}
for (int i = arg_0 - 1; i > 0; i--) {
hedi[arg_0 - 1 - i + 1] = &hedi[0][arg_4 * arg_8 * (arg_0 - 1 - i + 1)];
}
return hedi;
}
BYTE*** CreateItem(int arg_0, int arg_4, int arg_8)
{
BYTE*** hebp = (BYTE***)AllocMemory(arg_8 * 4);
hebp[0] = (BYTE**)CreateBytes(arg_0, arg_4 * arg_8, 1);
if (!hebp[0])
{
delete(hebp);
return 0;
}
for (int i = 1; i < arg_8; i++) {
hebp[i] = (BYTE**)AllocMemory(arg_0 * 4);
if (hebp[i]) {
for (int j = 0; j < arg_0; j++) {//eax
hebp[i][j] = &hebp[0][j][i];
}
}
else {
for (int j = i - 1; j > 0; j--) {//esi
delete(hebp[j - i]);
}
delete(hebp[0]);
delete(hebp);
return 0;
}
}
return hebp;
}
答案 0 :(得分:5)
这是您的问题:AllocMemory(arg_0 * 4)
在32位系统上,指针的大小是32位,即4个字节。在64位系统上,指针是64位, 8 字节。使用正确的大小(使用sizeof
运算符),它应该可以正常工作。
例如,在CreateBytes
函数中
BYTE** hedi = (BYTE**)AllocMemory(arg_0 * 4);
将其替换为
BYTE** hedi = (BYTE**)AllocMemory(arg_0 * sizeof *hedi);
还有许多其他问题,例如使用malloc
分配内存并使用delete
释放内存的代码。这会导致未定义的行为。
我甚至没有提到变量的命名或缺少评论......