社区
C++ 语言
帖子详情
关于使用realloc函数分配内存引来的错误
joe_fox1025
2005-01-06 10:21:24
我在一个算法中使用malloc and realloc来根据需要不断扩充内存。
可是现在有一个很奇怪的问题
就是程序总报错,我跟踪调试发现报错的地方并不确定。有的时候报错在前面,有的时候报错在后面。
我设置断点发现一个报错:Unhandled exception in C45ALGORITHM.exe(MSVCRTD.DLL) OxC0000005 Access
Violation.
请问哪位遇到过这样的问题
...全文
782
21
打赏
收藏
关于使用realloc函数分配内存引来的错误
我在一个算法中使用malloc and realloc来根据需要不断扩充内存。 可是现在有一个很奇怪的问题 就是程序总报错,我跟踪调试发现报错的地方并不确定。有的时候报错在前面,有的时候报错在后面。 我设置断点发现一个报错:Unhandled exception in C45ALGORITHM.exe(MSVCRTD.DLL) OxC0000005 Access Violation. 请问哪位遇到过这样的问题
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
21 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
killer1984
2005-01-13
打赏
举报
回复
另外,楼主贴的代码之所以这么乱是因为你贴的代码除第一行前都有3个tab,下次从中间抽代码的时候记得删除多余tab先。
推荐用editplus,直接纵列选取:)
killer1984
2005-01-13
打赏
举报
回复
^_^
呵呵,初始化确实很重要,还是不要寄希望于编译器比较好~
至于楼主的程序,首先有两处隐含错误,就是对指针进行NULL检查之后只打出了错误信息而没有进行进一步处理,之后继续执行其它代码,这在realloc失败之后会引发访问异常。
另外,我很愿意相信楼主给realloc传的指针参数都是malloc分配的指针或是空指针,但不排除楼主传入了数组首地址或是传入了没有进行任何初始化的局部变量指针的可能(因为代码不完整)。对前一种情况,该指针是常量指针,无法进行realloc操作,否则必然引发访问异常。后一种情况当然就是该指针指向一个不明位置,进行realloc操作当然会出错。
最后,我对楼主使用的size_att变量很感兴趣,假如该变量的值异常的话毫无疑问会出错。
从楼主给出的代码我只能得出这些信息了,还是检查一下这些地方先吧。
r_swordsman
2005-01-13
打赏
举报
回复
果然rdAttribData为NULL的话~~~虽然可是成功分配内存~~~但是不能rdAttribData赋值啊~~~~~
r_swordsman
2005-01-13
打赏
举报
回复
if((rdAttribData = (double*)realloc(rdAttribData, (size_att+1)*sizeof(double))) == NULL)
if(rdAttribData != NULL)
{
if((rdAttribData = (double*)realloc(rdAttribData, (size_att+1)*sizeof(double))) == NULL)
}
yjh1982
2005-01-13
打赏
举报
回复
楼上这位兄弟是高级潜水员吧:)
alexxing
2005-01-13
打赏
举报
回复
如果要在循环中反复realloc,一个好习惯是把指针p初始化为NULL
(p==NULL时realloc会自动调用malloc)
初始分配/再分配都用realloc,这样程序比较清晰
如果中间要free,free后记得p=NULL,这样数据意义就完整了
检查程序时只需要检查:除了p=NULL,p=realloc(...)外,没有其它对p的赋值操作
goodluckyxl
2005-01-11
打赏
举报
回复
killer1984(天行贱)
我主要表达的意思对非NULL指针即未初始化指针的realloc 操作
全局变量或着静态也是进行初始化工作的
-------------------------------------------
照你的说法“如果指针是全局或静态变量,则其初始化为NULL,”
类成员静态变量呢?
呵呵 我不是扣牛角
就是把主要意思表达一下就是说应该进行初始化工作
这本来就是程序员的一个好习惯 ^_^
joe_fox1025
2005-01-11
打赏
举报
回复
怎么贴的这么乱啊?晕倒
joe_fox1025
2005-01-11
打赏
举报
回复
for(i=0; i<m_lSampleNum; i++)
{
diff = 0;
for(k=0; k<size_att; k++)
{
AfxMessageBox("Test for the loop!");
if(m_rdSampleData[i*(m_iAttribNum+1)+j] == rdAttribData[k])//- rdClassData[k] < 10E-6)
{
//diff--;
lpSampleOfAttrib[k]++;
for(c=0; c<m_iClassNum; c++)
{
if(m_rdSampleData[i*(m_iAttribNum+1)+3] == m_rdClassData[c])
{
lpSampleInClass[k*m_iClassNum+c]++;
//if(rdClassData[k] == 0)
//AfxMessageBox("Test Only");
}
}
break;
}
else
{
diff++;
}
}
strTest.Format("i = %ld k = %d cursor = %d", i, k, cursor);
AfxMessageBox(strTest);
if(diff == size_att)
{
AfxMessageBox("Heap malloc.");
rdAttribData[size_att-1] = m_rdSampleData[i*(m_iAttribNum+1)+j];
lpSampleOfAttrib[size_att]++;
//AfxMessageBox("Malloc Memorry Heap!");
for(c=0; c<m_iClassNum; c++)
{
if(m_rdSampleData[i*(m_iAttribNum+1)+3] == m_rdClassData[c])
lpSampleInClass[size_att*m_iClassNum+c]++;
}
if((rdAttribData = (double*)realloc(rdAttribData, (size_att+1)*sizeof(double))) == NULL)
AfxMessageBox("rdAttribData reallocing in heap failed!");
size_att = _msize(rdAttribData)/sizeof(double);
rdAttribData[size_att-1] = -1;
strTest.Format("size-att = %d rdAttribData[%d] = %f", size_att, size_att-1, rdAttribData[size_att-1]);
AfxMessageBox(strTest);
strTest.Format("rdAttribData[%d] = %f", size_att-1-1, rdAttribData[size_att-1-1]);
AfxMessageBox(strTest);
AfxMessageBox("Realloc lpSampleOfAttrib started");
if((lpSampleOfAttrib = (long*)realloc(lpSampleOfAttrib, size_att*sizeof(long))) == NULL)
{
AfxMessageBox("lpSampleOfAttrib reallocing in heap failed!");
}
else
{
lpSampleOfAttrib[size_att-1] = 0;
}
AfxMessageBox("Realloc lpSampleOfAttrib finished");
AfxMessageBox("Realloc lpSampleInClass started");
if((lpSampleInClass = (long*)realloc(lpSampleInClass, size_att*m_iClassNum*sizeof(long))) == NULL)
{
AfxMessageBox("Reallocing in heap failed!");
}
else
{
for(c=0; c<m_iClassNum; c++)
lpSampleInClass[(size_att-1)*m_iClassNum+c] = 0;
}
AfxMessageBox("Realloc lpSampleInClass finished");
cursor++;
}
//match = false;
}
for(p=0; p<size_att-1; p++)
{
char MidStr[200];
sprintf(MidStr, "%f", rdAttribData[p]);
//AfxMessageBox(MidStr);
out<<rdAttribData[p]<<" ";
for(c=0; c<m_iClassNum; c++)
out<<lpSampleInClass[p*m_iClassNum+c]<<" ";
out<<lpSampleOfAttrib[p];
out<<endl;
}
out<<endl;
fordcot
2005-01-07
打赏
举报
回复
放出程序代码
goodluckyxl
2005-01-07
打赏
举报
回复
任何对于越界操作或者 未初始化的指针进行 realloc
都会内存错
yuzhenming
2005-01-07
打赏
举报
回复
给代码出来看看嘛,光这样描述,搞不来的!猩猩说话优先。。。
killer1984
2005-01-07
打赏
举报
回复
不一定是由于malloc和realloc的使用造成该错误。
楼主给出的信息不足以解决此问题。
killer1984
2005-01-07
打赏
举报
回复
to:goodluckyxl(被人遗忘的狗)
你的说法有些问题,不能说未初始化就一定会出错,如果指针是全局或静态变量,则其初始化为NULL,在C99中,对NULL指针使用realloc则分配size字节的内存并返回其指针,这时是不会出错的。
joe_fox1025
2005-01-06
打赏
举报
回复
应该没有,我把那些变量都看了,没问题啊
allen_zhaozhencn
2005-01-06
打赏
举报
回复
学习
xuelong_zl
2005-01-06
打赏
举报
回复
看看猩猩们怎么说,学习
yevv
2005-01-06
打赏
举报
回复
不敢吱声 都是些星星在说话
oo
2005-01-06
打赏
举报
回复
你有内存操作错误(内存越界使用)?
yjh1982
2005-01-06
打赏
举报
回复
代码样例
加载更多回复(1)
calloc、malloc、
realloc
函数
的区别及用法
本文详细对比了C语言中malloc、calloc和
realloc
三个内存管理
函数
的用法和区别,包括它们的参数、返回值以及在实际编程中的应用示例。解释了calloc如何在
分配内存
的同时进行初始化,以及
realloc
如何用于内存的动态调整。
【安全
函数
】
realloc
_s (): 从
realloc
到安全增强的进化之路
本文深入探讨C11标准中的
realloc
_s()
函数
,对比传统
realloc
()的安全缺陷,介绍其强制参数校验、明确
错误
码、双重指针输出和溢出保护四大安全机制。分析其在安全关键系统、库开发等场景的应用,并讨论兼容性与性能权衡,提供实战示例和跨平台解决方案。
动态内存
函数
malloc,calloc,
realloc
详解
本文详细介绍了C语言中动态内存管理的三个关键
函数
——malloc、calloc和
realloc
的
使用
,包括它们的作用、用法、区别及常见
错误
处理。还特别强调了动态内存释放的重要性,以防止野指针和内存泄漏问题。
realloc
、malloc、以及calloc
函数
的区别
本文详细解析了C语言中用于内存管理的三个
函数
:malloc、calloc 和
realloc
的
使用
方法及区别。介绍了它们如何帮助开发者有效地分配和管理内存,特别是在动态调整内存大小时的作用。
malloc、calloc、
realloc
、free
函数
的
使用
本文详细介绍了C语言中四种重要的内存管理
函数
:malloc、calloc、
realloc
和free。包括它们的功能、
使用
场景、注意事项及示例代码,帮助读者理解如何在C语言中有效地管理内存。
C++ 语言
65,211
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章