题目:下面这个函数有什么错误?(注释是我加的)char* Test(const char *str)
{
 static char m_str[MAX_N]; //m_str是static的,分配在静态存储区,不在堆,函数结束依然有效
 strcpy(m_str,str); //拷贝!MAX_N是足够大的
 return m_str; //返回静态存储区的指针(虽然不提倡这样,不过应该没有错误的)
}上面是我的分析~!有错误吗??高手指点一下!!!

解决方案 »

  1.   

    static char m_str[MAX_N]; //m_str是static的,分配在静态存储区,不在堆,函数结束依然有效
    你这个注释有点问题。函数内部的static申明的静态变量,只在该函数内部有效。下次调用该函数时,还是这个值,但到了函数外部,未必可以使用这块空间。说未必,是因为我没有写过这样的代码。
      

  2.   

    谢谢 happyparrot(快乐鹦鹉) 的回答就是说return m_str; 返回了无效指针??我记得好象不是这样~~我去查查~!~谢谢先记得函数内部static修饰的变量只第一次执行函数时执行??下次调用该函数时,还是这个值。那是不是上面函数每次都又执行了strcpy(m_str,str);拷贝操作而错误?
      

  3.   

    拷贝操作不会错误。无非是反复替换m_str中的内容而已。你自己做段代码一测试便知。看看返回的char*能不能操作
      

  4.   

    我认为这段代码是可以工作的。
    原因正如楼主所说“既然是静态的!~其生命期并不会随函数结束而结束!!”
    (去翻ISO C++白皮书)
    任何支持ISO C++的编译器都应该能跑通
    而且这种static做法虽然不那么优雅,但是有些时候不失为一种解决办法。
    另外,鹦鹉说:
    你这个注释有点问题。函数内部的static申明的静态变量,只在该函数内部有效。下次调用该函数时,还是这个值,但到了函数外部,未必可以使用这块空间。说未必,是因为我没有写过这样的代码。
    ========
    “函数内部的static申明的静态变量,只在该函数内部有效。”
    这是鸟人喝醉酒后发的侉话,大家不别介意^_^
      

  5.   

    谢谢  Featured(我握着爱情的门票静静排队……)   的回答!!你和我面试时候的见解是一样的!我在看林锐的 〈〈高质量c\c++编程指南 〉〉好好再看一遍!!呵呵!顶!!!顶!!顶!!!!
      

  6.   

    谢谢 zqql() ( )  的回答!~!可以操作就是没有错误了??那就是说不优雅但并没有ERROR????你是赋值操作还是取值操作!!用取值操作试试!!看取得的值和Test()函数赋给的值相同吗?
    面试时是问我有什么错误!!我说应该没有!不过考官未置可否我想将这个帖提交FAO!!大家觉得怎么样??
    顶!!!!!!!!!!!!!!!!!!
      

  7.   

    楼主的的静态变量的处理方法是可以达到在函数体外面修改函数的目的的
    其实这个也是c/c++ 当中使用最灵活的指针的一种特殊用法,用它可以突破一些框架的约束的比如,一个类的私有变量都可以用指针的方法来获取的比如:
    class A {
    private:
       int a;
    public:
       ....
    }
    在没有虚函数的情况下, 获得A的实例的地址的第一个元素就是a的地址,把A指针转换成int类型,就可以完成对a的访问这看似和c++类对象的私有性的亵渎,但是也可以看作是c++指针灵活性的体现指针是c++的优势,也是它最不安全的地方
    c#当中对它就有了不同的处理了
      

  8.   

    另外存在一个隐患,就是传入参数没有进行有效性判断,如果是无效指针或者没有0结尾,会导致指针越界访问错误。最好加一句if (strlen(str) < MAX_N)
      

  9.   

    谢谢 Mackz(在相互) ( ) 的回答!!我真是忽略了这个问题!!我太大意了!平时都用引用多!因为引用不会有无效的情况!就忽视了这是指针!没有对其有效性进行判断!!!再次感谢