gpt4 book ai didi

c++ - 为什么指针算术中的整数提升在 64 位代码中的行为与在 32 位代码中的行为不同?

转载 作者:搜寻专家 更新时间:2023-10-31 00:31:40 25 4
gpt4 key购买 nike

当为 64 位编译时,以下代码在访问 ptr[1-offset] 时因访问冲突而崩溃:

char* ptr = new char[4];
strcpy(ptr, "bar");
unsigned int offset = 2;
ptr+=offset;

char test0 = (ptr-offset)[2];
char test1 = ptr[2-offset];
char test2 = (ptr-offset)[1];
char test3 = ptr[1-offset];

delete (ptr-offset);

代码在为 32 位编译时执行得很好。

当我将 ptr[1-offset] 替换为 ptr[(int)(1-offset)] 或者当我更改 unsigned int offset = 2;int offset = 2; 代码也可以很好地执行 64 位。

显然在 64 位上,1-offset 的结果被提升为无符号整数类型,因此 ptr[1-offset] 不会解析为 ptr [-1],但为 ptr[maxValueOfSomeUnsignedIntegerType]

但是,为什么这只发生在 64 位上,而 1-offset 似乎被提升为 32 位的有符号整数类型?

这似乎不是特定于实现的——我用 VC++ 和 G++ 得到了相同的结果。

最佳答案

首先,1-offset 的结果始终是 UINT_MAX,与您的架构无关。仅这一点并不能解释差异。

如果将其转换为 int,您将获得实现定义的结果,但通常为 -1。与 int offset 相同,您只是得到导致 -1 的正常带符号整数算法。这样就可以了。

现在说明段错误的原因:显然,在您尝试的系统上,指针上的溢出算术环绕 mod 2^32。据我所知这是 UB,但它似乎适用于您的系统。所以你最终得到了 ptr[1]

另一方面,如果指针是 64 位宽,它可以表示 ptr + 2^32 - 1(至少在这种情况下显然如此),因此不会发生换行并且指针指向在您分配的内容之后,到一些大约 4GB 的无意义位置。

关于c++ - 为什么指针算术中的整数提升在 64 位代码中的行为与在 32 位代码中的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33551087/

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