char* wcg()
{
char a[20];
sprintf(a,"%s","abcdef");
return a;
};
int _tmain(int argc, _TCHAR* argv[])
{
char *p=wcg();
char sz1[30];
memcpy(sz1,p,30); char sz2[30];
sprintf(sz2,"%s",p);
return 0;
}我本来以为sz1和sz2都不会得到"abcdef",但结果是,sz1得到了,sz2不正常, 这是为什么啊?

解决方案 »

  1.   

    你返回的是局部变量的地址a,函数结束以后,使用的stack就释放了,操作系统实际上并没有及时清空stack上的数据,所以这些都是垃圾数据。
      

  2.   

    我本来以为sz1和sz2都不会得到"abcdef",但结果是,sz1得到了,sz2不正常, 这是为什么啊?
    ===========
    不管是sz1还是sz2都有可能取不到,char a[20];是一局部变量,你返回它的地址,结果是随机的。有可能没有及时清除,能得到值,也有可能得不到值 。
      

  3.   

    楼上正解,不过楼主说sz1获得了数据,sz2没有获得数据,这个应该只是个随机的,看系统有没有及时把栈上的数据清空或者分配出去,如果还没有,你就有可能获得那个垃圾数据,如果有,那你将获得别的数据。
      

  4.   

    //main.cpp   int a = 0; 全局初始化区   char *p1; 全局未初始化区   main()   {   int b; 栈   char s[] = "abc"; 栈   char *p2; 栈   char *p3 = "123456"; 123456\0在常量区,p3在栈上。   static int c =0; 全局(静态)初始化区   p1 = (char *)malloc(10);   p2 = (char *)malloc(20);   }   分配得来得10和20字节的区域就在堆区。   strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。
      

  5.   

    帮你改一下函数,就会得到正常结果了:
    char* wcg()
    {
        char a[] = "abcdef";/*静态区数据*/
        return a;
    };
    int _tmain(int argc, _TCHAR* argv[])
    {    
        char *p=wcg();
        char sz1[30];
        strcpy(sz1,p,30);
        char sz2[30];
        sprintf(sz2,"%s",p);
        return 0;
    }