63,594
社区成员




看这个老师的视频
#include <stdio.h>
int main()
{
int a = 0x12345678;
int b = 0x99991199;
int *p1 = &b;
char *p2 = (char*)&b;
printf("the p1-1 is %x, %x, %x\n", *(p1-1), p1[-1], *p1+1);
printf("the p2+1 is %x\n", p2[1]);
}
提到a和b的地址是连续的,而且 a高 b低。
在ubuntu上试了下,确实是的,运行结果如下:
但是在WIN11 64位系统下,却是这样的:
后来我再在Ubuntu上测试,发现又变了
p1+1没有读出a的值,然后我改了下 p1+1 改成 p1-1:
printf("the p1-1 is %x, %x, %x\n", *(p1-1), p1[1], *p1+1);
结果是:
显然变成了a 是比b的地址低的。
打印出的地址是:
很遗憾,因为无法再复现之前*(p1+1)能打印出a的情况,所以没有地址比对,不过也算能说明问题了。
我就想知道,这个到底是什么规则,如果说两个不同的系统,编译器不一样,规则不一样也就算了。为什么同一个系统/编译器,两次结果不一样啊。
哪位前辈可以帮忙解释一下吗
受一篇文章启发:
https://blog.csdn.net/pngfiwang/article/details/49624845
“在Visual Studio 开发环境中设置此编译器选项
打开此项目的“属性”对话框->C/C++ ->代码生成
修改下列属性之一或两者都修改:“基本运行时检查”或“较小类型检查”。”
所以我改了一下:
原来的默认设置: