64位架构 - 从函数返回时截断的字符指针

yog*_*haj 6 c c++ windows 64-bit

环境:

Windows x64位,带5GB RAM.我的二进制文件是64位版本,使用版本编译器构建 - "Microsoft(R)C/C++优化编译器版本14.00.50727.762 for x64"

环境设定:

Microsoft建议设置以下注册表项以测试64位应用程序,并在我的框中设置相同.如果我没有设置以下注册表,则不会发生此问题,因为程序位于低地址.讨论中提到了相同的注册表项 - 作为程序员,在迁移到64位窗口时需要担心什么?

要强制分配在较低地址之前从较高地址分配以进行测试,请在调用VirtualAlloc时指定MEM_TOP_DOWN或将以下注册表值设置为0x100000:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Memory Management\AllocationPreference

示例代码:

char *alloc_str()
{
    char *temp;
    temp = (char *) malloc(60);
    /* copy some data to temp */
    return temp;
}

main()
{
    char *str;
    str = (char *)alloc_str();
}
Run Code Online (Sandbox Code Playgroud)

分析:

malloc返回0x000007fffe999b40存储的地址,temp但当指针返回时main(),str只获取后半部分 - 0xfffffffffe999b40我无法访问该位置的数据.

Pat*_*ter 6

关于风格的两点,可以帮助诊断这类问题.在您使用时,malloc我认为它被编译为C程序.在这种情况下,不要在没有必要时进行类型转换.过多的类型转换可能会抑制警告,告诉您没有正确声明您的功能.如果没有原型并且函数定义在另一个模块中,那么您的调用str = (char *)alloc_str();将禁止在没有声明的情况下使用该函数的警告,并且将使用C的默认声明,即所有参数和返回值将被视为int.同样的事情malloc,如果你忘了正确的包含,你的类型转换将抑制警告,编译器将假定该函数返回一个int.这可能已经是截断的原因.另一点,在C,空参数列表声明与(void)()具有另外的含义(未指定参数).这些是C和C++之间不同的两点.