*p = 'a';有问题
char *p = new char(2);
说明P指向字符串
*p = 'a';就错了,应该是*p = “a”;

解决方案 »

  1.   

    是不是应该
    char *fun( )
    {
    char *p = new char(2);
             memset(p, '\0', 2);
    *p = 'a';
    return p;
    }
      

  2.   

    原题是这样的:char *fun( )
    {
    char *p = new char(2);
    .....................
    return p;
    }
      

  3.   

    分配的内存不会被释放,除非delete或free();因为内存是在堆中分配,
    而不是在栈中,所以函数退出时不会被释放
      

  4.   

    几点愚见:
    1. char *p = new char(2);
                        ^^^^^
              应该是用[],疑为笔误.
    2. 同batizhou(batizhou,不过这可以在函数外部释放,只要调用者
       被调用者之间达成一致意见.
    3. 由于p[1]不是'\0',所以如果调用者用返回值作为字符串首址的话,
       会出现意想不到的错误.
     总之这是非常不好的风格.
      

  5.   

    你用VC的时候没有重新定义new,那么它当然没有办法帮你查内存泄漏啦,哈哈
      

  6.   

    拜托.VC只要用了Win32Debug就是debug版的new和delete了
      

  7.   

    可能应该是
    char *fun( )
    {
    char *p = new char(2);
             if(p != NULL)
                 memset(p, '\0', 2);
             else{
                 //出错处理,因为没有分配到内存
                 return NULL;
             }
    *p = 'a';
    return p;
    }
      

  8.   

    我的意见和batizhou(batizhou)一样引用:*p = 'a';就错了,应该是*p = “a”;
    这个错大了,编译会失败的
    就算是p="a";那么指针的位置改变了
      

  9.   

    与lase(守望者) 的看法相反,我个人认为分配了一片内存空间后应该先将其清0,因为分配的空间中的内容是随机的,可能会在以后造成一些误会,清0可以避免一些意想不到的错误。
      

  10.   

    那我有几点问题:
    1、...new char(2),它的意思是什么,初始化呢?还是建立数组呢?
    2、这个程序段究竟能不能返回正确的值?
    3、对于赋值:
       *p='a'和*p="a",都是错的。*p = "a" ===> p = "a",赋地址。
                                 *p = 'a' 因为p可能是数组,所以不能赋值
      

  11.   

    to batizhou:
    你的看法是对的.我就是这么干的.
    不过我的也不错阿.我只是就这个程序说这个程序.
      

  12.   

    to whmouse:
    *p='a'当然是对的咯.就是因为p是数组,所以可以这样赋值阿.
    new char(2)不代表任何意思,当然是错误的咯.
    如果是要让new出来的内存第一个单元是a的话,这个程序的确
    返回了这个结果.
      

  13.   

    char *fun( )
    {
    //这里是不是new char[2]??
    char *p = new char(2);
    *p = 'a';
    //如果是,这里加一句
    *(p+1) = 0';
    return p;
    }
    只要在外部别忘delete []p,一切ok.
      

  14.   

    面试时出的查错题吗?要查什么类型的错误呢?char *fun( )
    {
    char *p = new char(2);
    *p = 'a';
    return p;
    }这道题并没有什么错误。
    > char* p = new char(2)
    这一句没错,功能是分配一个字符,并且字符初始化为'\x2',如此而已。
    > *p = 'a'
    这一句更没有错,它将刚分配的空间用 'a' 来填充。最后返回而已。至于风格不好的问题,那是仁者见仁,智者见智的,而且和应用相关。
    不知道哪位在C++编译上或运行中查出什么错误来了呢?
      

  15.   

    没有结束标志!也就是应该初始化该段内存!这个返回的字符指针布置在那里结束用了new应该再用delete,否则会引起内存泄漏!(可能性不大!vc本身会给你处理的)
      

  16.   

    给朋友送手机图片、铃声,请到: oksms.sms.163.com
      

  17.   

    各位,错误就如上面我写的程序!
    分配完内存后应该检查一下分配内存是否成功,其实就这段程序来说,本身并没有错,只是少了些健壮性!
    如果系统没有足够空间而造成new的错误,而后又*p = 'a';
    想想看,此时p=NULL, NULL是什么?NULL就是0, 所以p = 0;
    *p = 'a'也就是给0地址赋值'a'! 会产生什么后果在windows下我不太清楚,但我知道这肯定是越界访问!
      

  18.   

    to Muf:
     呵呵. 你说得比我还对.一直以为new XX()是new对象用的.
     没想到还可以对预设数据类型使用.
      

  19.   

    To: vtable9999(肝肝肝肝)  
    >  没程序结构好像没什么问题,但使用时会出差错Ok,请试试以下程序:
    int main()
    {
      
      for(int i = 0; i < 1000; i++)
      {
        char* p = func(); //:) 就功能而言,这一句有些象 char* p = new char('a');
        std::cout << *p;
        delete p;
      }}
      
    To: batizhou(batizhou) 
    例外处理的确不容忽视,但就本题而言,并非错误,而只是程序不够严谨。To: whmouse (飞天酷鼠)
    你当时是如何回答的?要知道,就此一题,并不能考出你的什么水平来,而你的应对却是非常重要的,答案的对错常常不是太主要。