char * getStr0()
{
char arrStr[] = "abcd";
return arrStr;
}
char * getStr1()
{
char *arrStr = "abcd";
return arrStr;
}int main(int argc, char* argv[])
{
//printf("Hello World!\n");
char *p;
p = getStr0();
printf(p); p = getStr1();
printf(p); system("PAUSE");
return 0;
}
输出为"abcd"即一个乱码加正确的输出abcd,想问一下为什么,内存中是怎样做的,心里不清楚.

解决方案 »

  1.   

    char * getStr0()
    {
        char arrStr[] = "abcd";//"abcd"在常量区,内容一般不会被改。拷贝到栈中
        return arrStr;//返回栈中的指针
    }
    char * getStr1()
    {
        char *arrStr = "abcd";
        return arrStr;//返回常量区中的指针,相当于传递"abcd"的地址
    }int main(int argc, char* argv[])
    {
        //printf("Hello World!\n");
        char *p;
        p = getStr0();//函数结束后,其申请的栈内存里的数据不确定
        printf(p);//输出不确定    p = getStr1();//执行后,p指向常量区"abcd"的地址
        printf(p);输出"abcd"    system("PAUSE");
        return 0;
    }
      

  2.   

    你两个函数返回的均为局部变量,第一个在函数内开辟了"abcd"的拷贝,函数返回后局部变量也就是"abcd"所占用的空间被释放了,你的指针也就变成了无效的指针,当然,这是如果被释放空间没有被重写,可能还会读到变量内容。第二个在函数返回后,只是局部指针变量被释放了,而"abcd"还存储在程序的常量区,指针从地址上看不是无效指针,但这种读取方式不属于正常访问。原因就是char arrStr[] = "abcd";和char *arrStr = "abcd";这两种形式在编译时处理是不同的,第一个arrStr是在程序运行时赋值的,第二个则是在编译时指定好的。
      

  3.   

    "abcd"是字符串常量,编译时在程序代码区中分配内存,程序运行过程中不会被释放和修改。
    char *arrStr = "abcd";得到的是字符串常量的内存地址,因为字符串常量的内存不会被释放和修改,所以printf输出的是abcd。
    char arrStr[] = "abcd";是在运行时把字符数组arrStr初始化为"abcd",因为是局部动态数组,其内存是在栈中动态分配的,函数返回后就自动释放了。这里的“释放”是指该内存不再由arrStr所占据,可以将其用于其它地方。释放后的内存中的数据是未知的,有可能保持释放前的数据,也有可能改变。