程序代码如下:内存错误发生在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;
}

解决方案 »

  1.   

    问题可能在memset(buf , 0 , 3*2);
    memcpy(buf,ext,3*2);
    buf是一个指针的指针,buf[0],buf[1]保存的是申请以后的空间
    你用memset和memcpy之后,此时的buf[0],buf[1]已经不是你用malloc所申请得到的空间地址了
      

  2.   

    你的错误是以为malloc出来的地址是连续的,但不一定是,你调试看看buf[0],buf[1],buf[2]
    大多数是不连续的,所以你下面的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;
    }
      

  3.   

    如果没有这么两句的话就对了
    memset(buf , 0 , 3*2);
    memcpy(buf,ext,3*2);
    你本来已经给buf数组的指针申请了空间,
    这时候你却改变了buf数组的值,其每一个成员的指向已经不是原来申请的空间,所以free失败
      

  4.   

    memset(buf[i],0,2);
    memcpy(buf[i],ext[i],2);
    是个正确的方式