社区
C++ 语言
帖子详情
关于使用realloc函数分配内存引来的错误
joe_fox1025
2005-01-06 10:21:24
我在一个算法中使用malloc and realloc来根据需要不断扩充内存。
可是现在有一个很奇怪的问题
就是程序总报错,我跟踪调试发现报错的地方并不确定。有的时候报错在前面,有的时候报错在后面。
我设置断点发现一个报错:Unhandled exception in C45ALGORITHM.exe(MSVCRTD.DLL) OxC0000005 Access
Violation.
请问哪位遇到过这样的问题
...全文
741
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)
Dll分配的内存块,应用释放的问题
写了个程序,在DLL中用malloc分配了一块内存,但是在exe程序中释放,结果程序crash,原因就是:其原因可能是堆被损坏,这也说明 TestMySticker.exe 中或它所加载的任何 DLL 中有 bug。想了半天以为是自己的写法有...
嵌入式C语言实战开发详解(四)
堆空间:malloc、
realloc
、calloc分配空间 数据段:bss:保存未初始化的全局变量 rodata:常量 .data(静态数据区):全局变量、static修饰变量(程序结束后释放) 2、内存的分配方式 (1)从全局数据区分配 (2)在...
你真的了解线性表中的顺序表了吗?(静态与动态顺序)
这里我们首先检查有没有空间和空间是否足够,如不够则进行扩容,这里扩容我们用到
realloc
函数
,
函数
具体
使用
方法和头文件详情请看下图。这里我们在创建一个结构体,不同的是,因为我们要实现一个动态的顺序表,所以...
Lua5.3——C API
函数
这里按字母次序列出了所有C API中的
函数
和类型。每个
函数
都有一个这样的提示:[-o, +p, x] 对于第一个域,o,指的是该
函数
会从栈上弹出多少个元素。第二个域,p,指该
函数
会将多少个元素压栈。(所有
函数
都会在弹出...
Lua中的基本
函数
库
基本
函数
库为Lua内置的
函数
库,不需要额外装载assert (v [, message]) 功能:相当于C的断言, 参数: v:当表达式v为nil或false将触发
错误
, message:发生
错误
时返回的信息,默认为"assertion failed!" ------------...
C++ 语言
64,648
社区成员
250,503
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章