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

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不会用啊。。。
...全文
569 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
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],这个很重要,也就是你是用其内存还是创内存存于其中的问题。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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