CString strfilter=CStaticVer::ms_strFilter;int strLength=strfilter.GetLength();char *filterBuffer=new char[strLength];//申请内存int x=sizeof(filterBuffer);memset(filterBuffer,0,sizeof(filterBuffer));int j=0;for (int i=0 ;i<strLength ;i++)
{
  filterBuffer[i]=strfilter[i];
 
}//中间是处理代码delete [] filterBuffer; //释放内存
filterBuffer=NULL;
这个程序我是想把 CString 类型的转换为 char *型。这样做程序正常运行了一段时间后突然就不行了。Strfilter里面的值是 “(ip or arp)” 正常情况下转换后 filterBuffer 里面的值应该是一样的。在出错后跟踪发现 filterBuffer 里的值变成了这样: “(ip or arp )               ”为什么会这样的呢?
我用的是VC++ 2005 MFC请高手指教啊。。还有一个问题是:我用sizeof(filterBuffer)获取缓冲去长度是返回值总是 4 这是为什么?

解决方案 »

  1.   

    char *filterBuffer=new char[strLength+1];//申请内存
    应该这样,最后一位应该定义成"\0"
      

  2.   

    出错时
    filterBuffer里面的值也可能会这样“(ip or arp屯屯    屯屯屯屯屯屯)”
      

  3.   

    一语惊醒梦中人啊
    mxw0922太谢谢了
    我愣是没考虑到这个。。太郁闷了
      

  4.   

    CString strfilter=CStaticVer::ms_strFilter; 
    可能用了getbuffer下面加一句strfilter.ReleaseBuffer();
      

  5.   

    首先一个问题,
    memset(filterBuffer,0,sizeof(filterBuffer)); sizeof(filterBuffer),你自己也知道结果了,总是4,所以你申请的内存只写了4个字节的0,后面都是乱码,缺少尾空,当然可能会看到任何字符了。解决上面这个问题,你首先要知道:
    char ca[255], *cp=new char[255];
    assert(sizeof(ca)==255);
    assert(sizeof(cp)==4);
    这样,你就知道
    memset(filterBuffer,0,sizeof(filterBuffer));   //这里应该用char *filterBuffer=new char[strLength];中的strLength了*****
    不过,你的问题CString到char*的转换,实际上没有这么麻烦
    CString实现有(LPCTSTR)转换符,也就是CString直接可以用在需要LPCTSTR类型的环境中,就是 const TCHAR *,或者,在很多情况下,就是 const char *
    如果你需要的是不带const的char*,你可以像下面这样:
    char * sp = cstring.GetBuffer();
    sp[3] = '\0';
    ...
    cstring.ReleaseBuffer();  //与GetBuffer必须成对出现!!!