在做列表中的栈这道题时,突然对函数能否返回局部变量的地址,比如自定义函数中的一个指针有一些疑惑,于是用下面的几个小程序做了验证
test1
#include <stdio.h>
#include <string.h>
char * fun(){
char *str = (char *)malloc(100);
scanf("%s", str);
if(!strcmp(str, "push")) strcpy(str, "PUSH");
if(!strcmp(str, "push")) strcpy(str, "POP");
return str;
}
int main(){
char a[10];
strcpy(a, fun());
printf("%s", a);
return 0;
}
结果
test2
#include <stdio.h>
#include <string.h>
char * fun(){
// char *str = (char *)malloc(100);
char str[100];
scanf("%s", str);
if(!strcmp(str, "push")) strcpy(str, "PUSH");
if(!strcmp(str, "push")) strcpy(str, "POP");
return str;
}
int main(){
char a[10];
strcpy(a, fun());
printf("%s", a);
return 0;
}
结果
test2
#include <stdio.h>
#include <string.h>
char * fun(){
// char *str = (char *)malloc(100);
// char str[100];
char static str[100];
scanf("%s", str);
if(!strcmp(str, "push")) strcpy(str, "PUSH");
if(!strcmp(str, "push")) strcpy(str, "POP");
return str;
}
int main(){
char a[10];
strcpy(a, fun());
printf("%s", a);
return 0;
}
结果
从上面的结果可以看出,c中不支持函数返回局部变量的地址,其实也就是常说的,函数中不能返回局部变量,因为在c中这些局部变量都是存储在栈中的,随着他们的作用域的消失而消失,局部变量的指针也是局部变量。如果我们要返回一个局部变量的指针,有两种方法,一、把这个指针声明为static。二、自己为这个指针所指的内容申请空间,这样的话只要自己没有释放这个变量,这个变量在整个程序的运行过程中就会一直存在。