程序代码如下:内存错误发生在free,请问原因为何?如何修改之。多谢
#include <iostream>
using namespace std;
char* buf[3];
char ext[3][2];
int main()
{
int j,k;
for(j = 0 ; j <3;j++)
for(k = 0 ; k < 2 ; k++)
ext[j][k] = 'c';
for(int i = 0 ; i < 3 ; i++)
{
buf[i] = (char*)malloc(sizeof(char) * 2);
if(!buf[i])
{
cout<<"memory allocate failed!"<<endl;
for(j = 0 ; j < i; j++)
{
free(buf[j]);
}
return 1;
}
}
memset(buf , 0 , 3*2);
memcpy(buf,ext,3*2);
for(i = 0 ; i < 3 ; i++)
free(buf[i]);
return 0;
}
#include <iostream>
using namespace std;
char* buf[3];
char ext[3][2];
int main()
{
int j,k;
for(j = 0 ; j <3;j++)
for(k = 0 ; k < 2 ; k++)
ext[j][k] = 'c';
for(int i = 0 ; i < 3 ; i++)
{
buf[i] = (char*)malloc(sizeof(char) * 2);
if(!buf[i])
{
cout<<"memory allocate failed!"<<endl;
for(j = 0 ; j < i; j++)
{
free(buf[j]);
}
return 1;
}
}
memset(buf , 0 , 3*2);
memcpy(buf,ext,3*2);
for(i = 0 ; i < 3 ; i++)
free(buf[i]);
return 0;
}
解决方案 »
- 创建一个窗口,用线条绘制一个图形,图形可以调整,要求窗口调整后图形一起成比例放大
- 如何是CTreeCtrl同时具有checkbox 和radio功能?或者具有下拉功能
- 【请教】和http服务器通讯,何时知道http服务器已和我关闭连接?
- GWLP_HINSTANCE 是什么意思阿?
- 一个怪问题!大虾请进!
- 无法定位序数712于动态链接库a.dll?
- FlyNow (荆棘鸟) 来领分
- Direct sound 播放大文件(100分)
- ribbon界面下的按钮添加图标
- 感谢CSDN!!!
- 各位帮忙,怎么在驱动文件中得到任何进程的全路径名,如c:\xxx\xxx\cmd.exe
- GetProfileInt()WriteProfileString()谁给说说?
memcpy(buf,ext,3*2);
buf是一个指针的指针,buf[0],buf[1]保存的是申请以后的空间
你用memset和memcpy之后,此时的buf[0],buf[1]已经不是你用malloc所申请得到的空间地址了
大多数是不连续的,所以你下面的memset和memcpy就越界了,到了free时就出错了。你应该像下面一样写,就没错了。
#include <iostream>
using namespace std;
char* buf[3];
char ext[3][2];
int main()
{
int j,k;
for(j = 0 ; j <3;j++)
for(k = 0 ; k < 2 ; k++)
ext[j][k] = 'c';
for(int i = 0 ; i < 3 ; i++)
{
buf[i] = (char*)malloc(sizeof(char) * 2);
if(!buf[i])
{
cout<<"memory allocate failed!"<<endl;
for(j = 0 ; j < i; j++)
{
free(buf[j]);
}
return 1;
}
memset(buf[i] , 0 , 2);
memcpy(buf[i], ext[i], 2);
cout << buf[i] << endl;
} for(i = 0 ; i < 3 ; i++)
free(buf[i]);
return 0;
}
memset(buf , 0 , 3*2);
memcpy(buf,ext,3*2);
你本来已经给buf数组的指针申请了空间,
这时候你却改变了buf数组的值,其每一个成员的指向已经不是原来申请的空间,所以free失败
memcpy(buf[i],ext[i],2);
是个正确的方式