char* get_str(void)
{
char str[] = {"abcd"};
return str;
}
char str[] = {"abcd"};定义了一个局部字符数组,尽管是数组,但它是一个局部变量,返回它的地址肯定是一个已经释放了的空间的地址。
此函数返回的是内部一个局部字符数组str的地址,且函数调用完毕后 此数组被销毁,所以你返回的指针也就指向一块被销毁的内存,这种写法是错误的。
char* get_str(void)
{
char *str = {"abcd"};
return str;
}
char* str = {"abcd"};表示先定义个字符串常量,并将其地址赋给str。
此函数返回的是字符串常量的地址,而像这种字符串都是属于全局的,在编译的时候就已经分配了内存了,只有程序退出的时候才会被销毁,所以返回它的地址是没有问题的,但是你最好返回常量指针,因为你不能去改变字符串常量的值。
char *str = "xxxxx",str指向该常量地址。
char str[] = "xxxxx",str在栈上申请空间,将常量内容复制进来,所以是局部变量。
char *a1 = "Hello1";
char *a2 = "Hello1";
char a3[] = "Hello2";
char a4[] = "Hello2";
那么在存储上,"Hello1"字符串只会有一份拷贝,a1和a2指向同一个位置; "Hello2"则有两份拷贝,分别存在不同的位置,a3、a4地址也各不相同