C语言中 主函数 连续两个变量 地址是连续的吗?

mosepplin 2023-05-15 16:19:29

08 指针运算符加减举例1_哔哩哔哩_bilibili

看这个老师的视频

#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的情况,所以没有地址比对,不过也算能说明问题了。

我就想知道,这个到底是什么规则,如果说两个不同的系统,编译器不一样,规则不一样也就算了。为什么同一个系统/编译器,两次结果不一样啊。

哪位前辈可以帮忙解释一下吗

...全文
418 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
mosepplin 2023-05-15
  • 打赏
  • 举报
回复

受一篇文章启发:
https://blog.csdn.net/pngfiwang/article/details/49624845
“在Visual Studio 开发环境中设置此编译器选项
打开此项目的“属性”对话框->C/C++ ->代码生成
修改下列属性之一或两者都修改:“基本运行时检查”或“较小类型检查”。”
所以我改了一下:
原来的默认设置:

img


修改后的设置:

img


再运行:

img


确实得出和Ubuntu上一样的结果。

  • 打赏
  • 举报
回复 1

在C语言中,局部变量通常存储在栈上,它们的地址通常是连续的。但是,这并不是一个强制性的规则,因为编译器可能会对变量进行重新排列以优化性能。因此,不能保证两个局部变量的地址一定是连续的

mosepplin 2023-05-15
  • 举报
回复
@i进击的攻城狮 谢谢您! 那个Ubuntu上 两次测试a和b两个变量第一次是a高b低,第二次a低b高,不一致的问题,前辈能帮忙解释下吗?是不是也是优化的一种体现?
赵4老师 2023-05-16
  • 举报
回复
@i进击的攻城狮 甚至编译器直接优化为一个寄存器不用内存都有可能。

64,849

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧