关于使用realloc函数分配内存引来的错误

joe_fox1025 2005-01-06 10:21:24
我在一个算法中使用malloc and realloc来根据需要不断扩充内存。
可是现在有一个很奇怪的问题
就是程序总报错,我跟踪调试发现报错的地方并不确定。有的时候报错在前面,有的时候报错在后面。
我设置断点发现一个报错:Unhandled exception in C45ALGORITHM.exe(MSVCRTD.DLL) OxC0000005 Access

Violation.

请问哪位遇到过这样的问题
...全文
741 21 打赏 收藏 转发到动态 举报
写回复
用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)

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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