鱼C论坛

 找回密码
 立即注册
查看: 124|回复: 6

指针

[复制链接]
发表于 2024-7-29 12:47:42 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
若数组指针左溢会发生什么情况
例如 int a[0],*p=a; p=p-1;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-29 12:47:52 | 显示全部楼层
哈哈,鱼油提问真有趣!讲到指针的左溢,我想起了“指针漂移”这个概念。我们来一起看看这个问题。

在C语言中,数组是一个连续的内存区域,而指针是用来指向某个内存地址的变量。当你定义 `int a[0]` 时,实际上你创建了一个长度为0的数组,这意味着这块内存是空的,没有任何可用的元素。当你这样做时:
int a[0];
int *p = a;
p = p - 1;  // 指针左溢

这里,`p` 最初指向数组 `a` 的第一个元素(其实没有元素,因为数组长度为0)。但是当你执行 `p = p - 1` 之后,指针 `p` 就会指向数组 `a` 之前的地址。很可能这块地址是你根本不该去触碰的地方,就像你在邻居家后院挖土而不告诉他们一样。

这时,有几种可能会发生的事情:
1. **未定义行为**:访问这个地址可能会导致程序崩溃,或者没什么事发生,但你永远不知道会出什么问题。这就像打开了潘多拉的盒子,结果里面可能是各种各样的怪兽。
2. **访问违规**:如果你尝试从这个地址读取数据,可能会导致操作系统给你一个“非法访问”的错误,类似于被保安请出去。
3. **数据破坏**:如果这个地址上恰好是其它变量的地方,修改它可能会导致你意想不到的结果,甚至让你的程序产生一些非常尴尬的bug。

所以说,使用指针时一定要小心,确保指针指向的是合法的内存地址,避免“左溢”这种情况发生。记住,就算是指针,也应该保持在规定的“水域”里游泳哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-29 13:00:13 From FishC Mobile | 显示全部楼层
FishC 发表于 2024-7-29 12:47
哈哈,鱼油提问真有趣!讲到指针的左溢,我想起了“指针漂移”这个概念。我们来一起看看这个问题。

在C ...

你的意思是他可能会报错也可能不报错 有可能正确输出也有可能错误输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-29 13:01:26 | 显示全部楼层
1203081549 发表于 2024-07-29 13:00
你的意思是他可能会报错也可能不报错 有可能正确输出 ...


没错,鱼油说得非常对!这就是指针的神秘之处,也是C语言编程中最让人“既爱又恨”的部分。我们可以把它想象成一张海洋地图,但有些区域标记不清,甚至是“危险水域”。你根本不知道在这些区域里会发生什么!

1. **可能报错**:在某些情况下,当你试图访问那些不该去的内存地址时,操作系统可能会阻止你,给出“非法访问”的错误。这就像你试图潜入私人游泳池,结果被保安抓住。

2. **可能不报错**:有时,程序可能继续运行,但结果却是完全不可预测的。比如,指针从一个不该访问的地方读取数据,可能会输出意想不到的值,甚至是个乱码。这就像是在黑暗的房间里摸索,或许碰到了宝物,也可能一脚踢到了桌子腿。

3. **可能正确输出**:极少数情况下,如果你意外地指向了另一个合法地址,并且那里正好有你认为的“正确”数据,这样运气好的话可能不会报错。但这只是偶然,不能依赖!就像你在钓鱼时可能偶尔钓到一条大鱼,但不是每次都能这么好运。

总之,使用指针要小心谨慎,尤其是避免它们左溢哦!尽量保持你的指针在安全的区域里游泳,不然你可能会召唤出一些奇怪的水怪来。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-29 13:20:16 | 显示全部楼层
应该会报错(我试了)
就算能正常运行,但结果估计还是错的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-29 14:01:02 From FishC Mobile | 显示全部楼层
三体人的智子 发表于 2024-7-29 13:20
应该会报错(我试了)
就算能正常运行,但结果估计还是错的

是的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-1 12:38:27 | 显示全部楼层
当声明一个数组如 int a[0],这实际上是不合法的C语言语法,因为数组长度必须是正整数。不过,为了理解你的意图,我们假设你想讨论的是指针操作导致的潜在问题。
如果有一个有效的数组,如 int a[5],并且有一个指向其首元素的指针 *p = a;,执行 p = p - 1; 会导致指针p指向数组之外的内存区域,这被称为指针的左溢。这种情况下,p不再指向数组内的有效元素,而是指向了数组之前的未知内存区域。访问或修改p所指向的内存是未定义行为,可能会导致以下几种情况:
1.
程序崩溃:操作系统可能检测到非法内存访问并终止程序。
2.
数据损坏:指针可能错误地修改了其他重要数据,导致程序运行异常。
3.
无明显影响:如果该内存区域未被分配给其他用途,程序可能看似正常运行,但这掩盖了潜在的危险。
4.
奇怪的行为:程序可能表现出难以预料的行为,因为其操作了不属于它的内存空间。
总结来说,数组指针的左溢会导致未定义行为,这是编程中应极力避免的错误。在实际编程实践中,应当确保指针始终在合法范围内移动和访问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 11:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表