C语言中,变量赋值后被强制修改的原因
一个局部变量赋值后,经过一些代码,但没再次给这个变量赋值,有时候这个值却被奇怪的修改了,我想知道有哪些原因可能会导致变量的值改变,我知道有种情况可能导致变量的值改变,比如...
一个局部变量赋值后,经过一些代码,但没再次给这个变量赋值,有时候这个值却被奇怪的修改了,我想知道有哪些原因可能会导致变量的值改变,我知道有种情况可能导致变量的值改变,比如地址越界,可能有的变量的地址被越界地址覆盖而导致修改了。因为我的代码很长,没法贴出来,而且那种问题不是经常会出现,只是偶尔,我是在一个while循环外面赋值的,然后进入while循环,是个死循环,只有认为下指令退出才能结束的,所以程序运行时间也很长的。
while循环内部,有地方进行了内存分配,完了之后又释放了,但应该是没有越界的,while循环中实现的功能很多,还调用了外部的函数,函数中也有过内存分配问题,贴出其中的小一部分:
pdata = (unsigned short *) malloc(m_bore.Wid * ypos * 2); //分配空间
fseek(m_bore.pImg_file,current_height * m_bore.Wid *2+m_bore.gFileHeader.FileHeader.nFileHeaderSize,0); //文件定位
printf("m_bore.Wid = %d, ypos = %d\n", m_bore.Wid,ypos);
fread(pdata, 2, m_bore.Wid * ypos,m_bore.pImg_file); //读取文件中的某一部分
(((key_str*) key_struct)->fb)->fb_piece_preview(current_height, (void*) pdata,m_bore.Wid,ypos);//显示读取出来的数据,是图片,文件中存的都是图片的像素值
free(pdata); //释放空间
类似这种分配空间有好多处 展开
while循环内部,有地方进行了内存分配,完了之后又释放了,但应该是没有越界的,while循环中实现的功能很多,还调用了外部的函数,函数中也有过内存分配问题,贴出其中的小一部分:
pdata = (unsigned short *) malloc(m_bore.Wid * ypos * 2); //分配空间
fseek(m_bore.pImg_file,current_height * m_bore.Wid *2+m_bore.gFileHeader.FileHeader.nFileHeaderSize,0); //文件定位
printf("m_bore.Wid = %d, ypos = %d\n", m_bore.Wid,ypos);
fread(pdata, 2, m_bore.Wid * ypos,m_bore.pImg_file); //读取文件中的某一部分
(((key_str*) key_struct)->fb)->fb_piece_preview(current_height, (void*) pdata,m_bore.Wid,ypos);//显示读取出来的数据,是图片,文件中存的都是图片的像素值
free(pdata); //释放空间
类似这种分配空间有好多处 展开
3个回答
展开全部
重点就在while循环啊,你要贴出while循环内做了什么操作才行吧。
一个死循环很容易内存溢出,那导致你参数值被修改了就很正常了。
也就是你说的哪种情况,可能while内部对内存重新分配,覆盖了
变量的地址的某一部分。
有时候bug的出现有可能跟代码的关系并不是特别大,bug出现要记录bug出现的环境和测试的用例。
在不能实现用户环境和没有测试用例的情况下,这种bug是很难找出或者重现的。
所以其实,外人的帮助并不会很大,而是你要通过项目的了解,从而按逻辑来推测,可能出现的原因和位置,然后针对推测来做测试。这样儿才能有效的解决这类问题。
我们做软件的时候最头疼的就是客户遇到bug,但是由于一些机密因素,我们没法拿到客户的环境,甚至测试的用例和root case,那我们就只能自己根据逻辑推测了。所以我们会尽量的log每一个可能出现问题的地方,便于bug的重现和定位。当然这些都是题外话,因为你这个项目我们没法接触,所以实在不知从何下手。
我有个建议,因为你分配空间的地方特别多,虽然有释放,但是也有可能分配的时候覆盖了那个变量,从而导致释放的时候也给清空了,那么变量的值随机,就很有可能是负数。
所以你可以尝试分配一个较大的空间,看能否覆盖掉变量的空间。我感觉这方面的可能性比较大。
一个死循环很容易内存溢出,那导致你参数值被修改了就很正常了。
也就是你说的哪种情况,可能while内部对内存重新分配,覆盖了
变量的地址的某一部分。
有时候bug的出现有可能跟代码的关系并不是特别大,bug出现要记录bug出现的环境和测试的用例。
在不能实现用户环境和没有测试用例的情况下,这种bug是很难找出或者重现的。
所以其实,外人的帮助并不会很大,而是你要通过项目的了解,从而按逻辑来推测,可能出现的原因和位置,然后针对推测来做测试。这样儿才能有效的解决这类问题。
我们做软件的时候最头疼的就是客户遇到bug,但是由于一些机密因素,我们没法拿到客户的环境,甚至测试的用例和root case,那我们就只能自己根据逻辑推测了。所以我们会尽量的log每一个可能出现问题的地方,便于bug的重现和定位。当然这些都是题外话,因为你这个项目我们没法接触,所以实在不知从何下手。
我有个建议,因为你分配空间的地方特别多,虽然有释放,但是也有可能分配的时候覆盖了那个变量,从而导致释放的时候也给清空了,那么变量的值随机,就很有可能是负数。
所以你可以尝试分配一个较大的空间,看能否覆盖掉变量的空间。我感觉这方面的可能性比较大。
展开全部
不好查找原因的,大多都是由于其它变量进行了越界写操作。这些包括:
(1)数组下标越界
(2)字符串操作时没有注意末尾应有'\0'
(3)指针没有赋初值(NULL)
(4)memcp指定的拷贝长度超过了目标地址的空间大小
等等,不一而足。
gdb debug中的watch命令对这种问题比较有效。
如果是在linu环境下,使用valgrind能较易查出问题。
(1)数组下标越界
(2)字符串操作时没有注意末尾应有'\0'
(3)指针没有赋初值(NULL)
(4)memcp指定的拷贝长度超过了目标地址的空间大小
等等,不一而足。
gdb debug中的watch命令对这种问题比较有效。
如果是在linu环境下,使用valgrind能较易查出问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
越界的可能性最大
先用一个方法看是否是越界造成的,加一个全局变量,所有对该局部变量操作的地方都同样对全局变量做同样操作。这样看局部变量不正常时,全局变量值是否也不正常,如果是,那么就不是越界而是其他问题,比如哪里操作失误
然后查看局部变量地址,看与他临界的变量有哪些,尤其是指针数组一类的,在仔细研究哪里会导致越界
先用一个方法看是否是越界造成的,加一个全局变量,所有对该局部变量操作的地方都同样对全局变量做同样操作。这样看局部变量不正常时,全局变量值是否也不正常,如果是,那么就不是越界而是其他问题,比如哪里操作失误
然后查看局部变量地址,看与他临界的变量有哪些,尤其是指针数组一类的,在仔细研究哪里会导致越界
追问
ye = meanpixel * ((count_min * step_num));
我怀疑是meanpixel被修改了,是局部变量,step_num是全局变量,它的值没被修改,出的问题是突然某一刻ye求出来的是负数,但实际上是不可能的,count_min是实时求出来的。
我现在最大的问题是这个被修改的情况很难出现,我没遇到过,是别人遇到了向我们反映的
追答
如果不好重新的话 只能查代码了 没有什么其他的好办法
尤其涉及到全局变量 很难说是哪里出的问题
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询