gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 13:19:18 26 4
gpt4 key购买 nike

环境:

具有 5GB RAM 的 Windows x64 位。我的二进制文件是一个 64 位二进制文​​件,编译器版本为 -“Microsoft (R) C/C++ Optimizing Compiler Version 14.00.50727.762 for x64”

环境设置:

Microsoft 建议设置以下注册表项以测试 64 位应用程序,我已在我的框中进行了相同的设置。如果我不设置以下注册表,则不会出现此问题,因为该程序位于低地址。讨论中提到了相同的注册表项 - As a programmer, what do I need to worry about when moving to 64-bit windows?

要强制分配在低地址之前从高地址分配以用于测试目的,请在调用 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();
}

分析:

malloc 返回存储在 temp 中的地址 0x000007fffe999b40 但是当指针返回到 main() , str 仅获取后半部分 - 0xfffffffffe999b40 并且我无法访问该位置的数据。

最佳答案

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

关于c++ - 64 位架构 - 从函数返回时字符指针被截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4749334/

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