0.总结
1. 不能以局部变量的方式创建字符串数组的首地址
2.如果函数的返回值非要是一个局部变量的地址,那么该局部变量一定要申明为static类型
3.返回指向字符串常量的指针
4.数组不能作为函数返回值
5.在函数中可以返回局部变量的值,但是不能返回局部变量的地址
6.可以返回堆内存的指针
1. 不能以局部变量的方式创建字符串数组的首地址
#include <stdio.h>
char *returnStr()
{
char p[] = "hello world!";
return p;
}
int main()
{
char *str;
str = returnStr();
printf("%s\n", str);
return 0;
}
此段代码无法正常完成要求
错误原因
"hello world!"是局部变量,存放在栈中,函数执行结束内存被清空 ,函数返回的是被释放的地址,打印出来是乱码
修改方式
2.如果函数的返回值非要是一个局部变量的地址,那么该局部变量一定要申明为static类型
原因:加上static 更改变量的生命周期 不会随着returnStr函数被释放;
3.返回指向字符串常量的指针
原因:
函数退出后,指针变量本身 (4个字节,一般在栈上)会被释放,但它所指向的内存区域不会被释放
4.数组不能作为函数返回值
因为编译机会把数组名当做局部变量(数组)的地址。返回数组一般用返回指向这个数组的指针代替。指针不能指向自动数组,因为会在函数结束后会被抛弃,可以指向静态局部数组的指针,因为静态存储器是从对象定义道程序结束的。
5.在函数中可以返回局部变量的值,但是不能返回局部变量的地址
int returnint()
{
int a = 5;
return a;
}
6.可以返回堆内存的指针
即通过malloc申请存储在堆空间
char *GetMemory3(int num)
{
char *p = (char *)malloc(sizeof(char) * num);
return p;
}