C++解析char *p与char p[]

首先来看一道题目:

#include "stdio.h"
char *get_string_1()
{
    char p[] = "hello world!";
    return p;
}
char *get_string_2()
{
    char *p = "hello world!";
    return p;
}
int main()
{
    char *p;
    p = get_string_1();
    printf("get_string_1:%s\n",p);
    p = get_string_2();
    printf("get_string_2:%s\n",p);
    return 0;
}

输出:
get_string_1:(乱码或者没有输出),linux下没有任何输出
get_string_2:hello world!
为什么会这样?

1.”hello world”是一个字符串常量,存放在静态数据区,没错,但是把一个字符串常量赋值给了一个局部变量,该变量存放在栈中。
这样就有两块内容一样得内存,也就是说“char p[]=”hello world!”;这条语句让“hello world!”这个字符串在内存中有两份拷贝,一份在动态分配的栈中,另一份在静态存储区。
当get_string_1函数退出得时候,栈要清空,局部变量内存也被清空了,所以这个时候函数返回得是一个已经释放了得内存地址。

2.因为”hello world!”是一个字符串常量,存放在静态数据区,把该字符串常量存放的静态数据区的首地址赋值给了指针。所以get_string_2函数退出时,该该字符串常量所在内存不会被回收,故能够通过指针顺利无误的访问。

猜你喜欢

转载自blog.csdn.net/c243311364/article/details/81502722