关于c语言内存分配的一个问题
有个函数:
char *getString()
{
char str[20]="I love Fanta";
return str;
}
在main函数中调用它,如下:
int main()
{
char *buffer;
buffer=getString();
printf("%s\n",buffer);
}
此时打印输出的是乱码,这是因为str指针是局部变量,存在于栈中,当getString函数执行完后被释放了。但是当把
char str[20]="I love Fanta";改为char *str="I love Fanta";后却能打印输出I love Fanta,此时str也是局部变量,也是
存在于栈中,当getString函数执行完后也会被释放,为什么却能输出I love Fanta呢?求解
[解决办法]
第一种
char str[20]="I love Fanta";
str是一个数组,它在栈内存中,它的内容是那个字符串,在执行完这个函数的代码后,栈内存就会被释放,返回的是一个野指针。
第二种
char *str="I love Fanta";
str是一个指针,而"I love Fanta"存放在字符常量区,str中存放的是这个字符串在字符常量区中的地址,在返回主函数后,字符常量区是不会有任何改变的,返回的也是指向字符常量区的指针,因此可以得到想要的效果。
[解决办法]
c 语言函数间传递的是数值 (参数,返回值)。两次返回的都是指针值,唯一不同之处是:一个指向即将销毁的 stack, 一个指向常量区
[解决办法]
第一种是函数的局部变量,编译器会有警告:[Warning] address of local variable `str' returned --返回地址局部变量STR“
第二种如楼上所说,存放在字符常量区。
[解决办法]