指针被莫名其妙的修改了!!求助啊!!

华为怎么进BT365 admin 2025-08-19 02:29:30

社区

C语言 帖子详情 指针被莫名其妙的修改了!!求助啊!! toddytao 2011-09-20 10:19:25 大家好。。我有一个程序。。框架如下:

int B(int *p)

{

// 调用一个库函数

库函数XXX(p);

}

int A(int * p)

{

char * ptr = (char*) malloc(20);

B(p);

}

现在的问题是,单在A函数中调用B函数后,指针ptr会被修改,使得它指向了别的一块内存区域。。。这样我程序中访问的时候。。。就会给出段错误。

请问为什么指针ptr会被修改的。。。函数B中并没有用到ptr指针啊。。。? 费解

更奇怪的是,指针p也会被修改。。。我在B函数中是改变了p指针所指向的区域的内容。。并没有改变p指针本身啊。。没有让它指向别的区域。。。

调试好久了。。。头疼啊。。。大家帮帮忙啊。。。

对了。。。AIX平台上。。什么调试工具还用啊。。DBX不会用啊。。。

...全文

918 12 打赏 收藏 指针被莫名其妙的修改了!!求助啊!! 大家好。。我有一个程序。。框架如下: int B(int *p) { // 调用一个库函数 库函数XXX(p); } int A(int * p) { char * ptr = (char*) malloc(20); B(p); } 现在的问题是,单在A函数中调用B函数后,指针ptr会被修改,使得它指向了别的一块内存区域。。。这样我程序中访问的时候。。。就会给出段错误。 请问为什么指针ptr会被修改的。。。函数B中并没有用到ptr指针啊。。。? 费解 更奇怪的是,指针p也会被修改。。。我在B函数 复制链接

扫一扫 分享 转发到动态 举报 AI 作业

写回复 配置赞助广告取 消

确 定

用AI写文章 12 条回复 切换为时间正序 请发表友善的回复… 发表回复 打赏红包 需支付: 0.00 元 取 消 确 定 lengxujun 2011-09-21 打赏举报 回复 [Quote=引用 10 楼 zhao4zhong1 的回复:]

Setting a Breakpoint When the Value at a Specified Memory Address Changes

To break when the value at a specified memory address changes

From the Edit menu, click Breakpoints.

Click the Data ……

[/Quote]

如果在VS中调试,下个数据断点...

再就是别人看的话,无代码,无真相... AndyZhang 2011-09-21 打赏举报 回复 你能告诉我ptr是干什么的么,没看到你用啊??????????? 赵4老师 2011-09-21 打赏举报 回复 Setting a Breakpoint When the Value at a Specified Memory Address Changes

To break when the value at a specified memory address changes

From the Edit menu, click Breakpoints.

Click the Data tab of the Breakpoints dialog box.

In the Expression text box, type the memory address for the byte.

For a word or doubleword memory address, enclose the address in parentheses, and precede it with a cast operator. For example, WO(21406036) for the word at memory location 21406036. Use the cast operator BY for a byte (optional), WO for a word, or DW for a doubleword. (The debugger interprets all integer constants as decimal unless they begin with zero (0) for octal or zero and x (0x) for hexadecimal.)

In the Number Of Elements text box, type the number of bytes, words, or doublewords to monitor. If you used the BY operator in the Expression field, specify the number of bytes. If you used WO, specify the number of words. If you used DW, specify the number of doublewords.

Click OK to set the breakpoint.

绿野耕夫 2011-09-21 打赏举报 回复 看你的描述是怀疑库函数有问题了,就算你的代码除了上百次的问题,库函数也不会出一次问题的。你这样描述问题是在用你自己的思路来误导别人,想让别人帮你查错,就不要带自己的主观思维进来,因为很明显你的思维出错了。

你说你“在B函数中是改变了p指针所指向的区域的内容。。并没有改变p指针本身啊。。没有让它指向别的区域。。。”,这只是你说,具体还要大家看过代码才知道到底你说的对不对。

ptr和p都是局部变量,存放在栈中,栈中数据被篡改了,那么应该是有另外的局部变量溢出了。所以进一步推测,你的函数A和函数B里应该还有其他的局部变量,而出问题的应该就是其他的局部变量,是因为其他的局部变量溢出导致了ptr和p被修改,并不是处理ptr和p的代码除了问题,你查错的方向恐怕都错了。如果你排除了A和B的局部变量出问题的可能,那也许还有其他函数的局部变量出问题,比如:中断函数,这种函数就算单步跟踪也难搞。 maquan 2011-09-20 打赏举报 回复 十有八九是你的 B() 函数中对局部变量访问的时候越界,导致栈空间被冲毁。(如果你的 B() 函数真如你所示只有一行的话,那问题就是出在“库函数XXX(p)”中。

举个具体的例子,函数里定义了一个 char[10] 的局部变量,然后写进了 100 个字节,然后就咔咔……

————————————————————————————————

基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :) billow_zhang 2011-09-20 打赏举报 回复 但从你列出的程序是看不出问题的.这个问题的很大原因,就是在程序里有内存溢出的情况.这个时候,程序的任何地方的值都有可能出现不正常的现象.

你可以逐渐删除程序语句,并且让错误重现,并且不断跟踪出现奇怪值的变量. 一般就能找到错误的地方.

碎碎念 2011-09-20 打赏举报 回复 int A(int * p)

{

char * ptr = (char*) malloc(20);

B(p);

//是在这里以后发现p的内容改变了?还是在B函数里?

}

至于ptr为什么会在B里改变?你还是跑跑单步吧。。。 Jake443403168 2011-09-20 打赏举报 回复 好好检查一下把,看是哪个地方把保存申请到空间首地址的指针的指向给弄变了 toddytao 2011-09-20 打赏举报 回复 [Quote=引用 3 楼 anyidan 的回复:]

看来你要贴全代码,或者你调用了那个 库函数

[/Quote]

全代码很长。结构有点混乱。。。公司的电脑上。也拿不到啊。。 AnYidan 2011-09-20 打赏举报 回复 看来你要贴全代码,或者你调用了那个 库函数 toddytao 2011-09-20 打赏举报 回复 [Quote=引用 1 楼 qq120848369 的回复:]

谁知道啊,你的p是作为[in]还是[out],这个很重要,也就是你是用其内存还是创内存存于其中的问题。

[/Quote]

这个p既是in又是out的。。先要传数据进去。。。。在函数里面经过修改后。。再传出来啊。。。

很是头疼。。别人写的代码。。有点混乱。。 qq120848369 2011-09-20 打赏举报 回复 谁知道啊,你的p是作为[in]还是[out],这个很重要,也就是你是用其内存还是创内存存于其中的问题。 求助!求职导向,时间紧迫,只打算系统联系后端,有没有实战项目 一面 4.2 c++八股,多线程,智能指针,项目等,两道算法题二面4.3 项目经历,两道算法题,接雨。一面4.11 统计小于给定数字包含数字6的个数,如6,16,26,66等。美团13日笔试的,A了3.3道,现在还没约面,志愿从前... 上场,与世界交手 | 地平线24届秋招空宣829不见不散 基本思路如果链表中有环,经过数学推导,当...快慢双指针判断链表是否有环链表是否有环一般用快慢双指针判断,快指针每次走两步,慢指针每次走一步,如果有环两个指针必然会相遇,如果没有环,快指针会先碰到null指。 各路大牛的C语言编程建议和技巧! 指针在学术界的名声不太好,因为它太危险了,莫名其妙地就变得糟糕的不行。但我认为它是强大的符号,它可以帮助我们清楚地自我表达。 思考:当有指针指向对象时,对于那个对象,确切地说它只是名称,其它什么也... ConcurrentHashMap源码深度解析(二)(java8)——直呼Doug Lea是真的细(带你参透扩容机制) 有些细节看着莫名其妙,一想就是好几天,看似想明白也只能算是猜想合理,直呼Doug Lea的心思是真的细啊! 深究细节是费时且痛苦的,欣喜的是,怎么也想不明白的逻辑,发现这次是源码错了!官方JDK!现在市面上普遍都... offer求助 引流字节阿里百度腾讯网易米哈游华为比亚迪 链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向 题解 | #朋友的年龄和# age_list = list(map(int, input()....

C语言

70,023

社区成员

243,260

社区内容

发帖 与我相关 我的任务 C语言 C语言相关问题讨论 复制链接

扫一扫 分享 确定 社区描述 C语言相关问题讨论 社区管理员

加入社区

获取链接或二维码

近7日

近30日

至今

加载中

查看更多榜单

社区公告

暂无公告 试试用AI创作助手写篇文章吧

+ 用AI写文章

相关文章

吸盘吸不住到底是什么原因?不外乎下面几种情况

六个字的浪漫句子大全

俞灏明为什么会被烧伤:拍《我和春天有个约会》被烧伤的

权威发布! 开发人员需要关注的11种顶级恶意软件

胳的解释

塞尔维亚世界杯名单:弗拉霍维奇、米林科维奇、科斯蒂奇在列

去哪里申请盛付通正规个人pos机非常好

游戏攻略🔥DNF陨石装备全解析及最佳掉落地点揭秘

什么能让空调腐蚀空调的外机最怕什么?