char* str = new char[4];
memset(str,0,4);

解决方案 »

  1.   


    查了下memset(str, 0, 4)是使用ASCII表中编号为0的字符(空字符)初始化str.但是当我定义char* str = new char[3];的时候,不管这个str当中的初值字符是什么,在使用CFile::Read的时候,不是会用读取出来的字符“TAG”(ASCII: 54 41 47)来覆盖掉之前的内容吗,既然我设置的str的内存只有3个字节,那么理论上只能存放下”TAG“,那后面的那些乱码又是存放在哪里的呢?为什么这个在申请内存的时候,要多申请1个字节的位置呢?
      

  2.   

    char* str = new char[3];// [4]
    str[3]=0; // 0 1 2 = T A G     ;;;  3=0 (0 结尾 sz)
    m_mp3.Read(str, 3);// 只读3个, 如果TAG在文件中是字符串 就可以读 4个 (包括0)
    m_mp3.Close();
     
    if(str == "TAG")return; 可以:  strncmp(str,"TAG",3);//   "TAG" 是字符串,  str 不是 字符串 , 加0 才是
      

  3.   


    查了下memset(str, 0, 4)是使用ASCII表中编号为0的字符(空字符)初始化str.但是当我定义char* str = new char[3];的时候,不管这个str当中的初值字符是什么,在使用CFile::Read的时候,不是会用读取出来的字符“TAG”(ASCII: 54 41 47)来覆盖掉之前的内容吗,既然我设置的str的内存只有3个字节,那么理论上只能存放下”TAG“,那后面的那些乱码又是存放在哪里的呢?为什么这个在申请内存的时候,要多申请1个字节的位置呢?读取的会覆盖掉之前的内容,多申请一个位置是用来放结束标志'\0'的。
    你这里没有结束标志,所以编译器认为你的串还没结束,就从内存地址继续取字节放到str中了,就是一些随机的内容了
      

  4.   


    查了下memset(str, 0, 4)是使用ASCII表中编号为0的字符(空字符)初始化str.但是当我定义char* str = new char[3];的时候,不管这个str当中的初值字符是什么,在使用CFile::Read的时候,不是会用读取出来的字符“TAG”(ASCII: 54 41 47)来覆盖掉之前的内容吗,既然我设置的str的内存只有3个字节,那么理论上只能存放下”TAG“,那后面的那些乱码又是存放在哪里的呢?为什么这个在申请内存的时候,要多申请1个字节的位置呢?读取的会覆盖掉之前的内容,多申请一个位置是用来放结束标志'\0'的。
    你这里没有结束标志,所以编译器认为你的串还没结束,就从内存地址继续取字节放到str中了,就是一些随机的内容了看来我的猜测正确了,谢谢啊~