1:概述
C语言中是不允许返回局部变量的,因为局部变量分配在栈上,函数返回后内容就会被销毁,所以你得到的
值将是乱码,但是C编译器也有可能会帮你优化,让返回正确的值,但我们永远不要依赖编译器。
2:例
- #include <stdio.h>
-
#include <stdlib.h>
-
#include <string.h>
-
-
char *
-
tst_var_0(void)
-
{
-
char s[128] = "hello";
-
-
return s;
-
}
-
-
char *
-
tst_var_1(void)
-
{
-
return "hello";
-
}
-
-
char global_array[128];
-
-
char *
-
tst_var_2(void)
-
{
-
strcpy(global_array, "hello");
-
return global_array;
-
}
-
-
char *
-
tst_var_3(void)
-
{
-
static char buf[128];
-
strcpy(buf, "hello");
-
-
return buf;
-
}
-
-
char *
-
tst_var_4(void)
-
{
-
char *s = (char *)malloc(128);
-
strcpy(s, "hello");
-
-
return s;
-
}
-
-
void
-
tst_var_5(char *res)
-
{
-
strcpy(res, "hello");
-
}
-
-
int
-
main(int argc, char **argv)
-
{
-
printf("%s\n", tst_var_0());
-
printf("%s\n", tst_var_1());
-
printf("%s\n", tst_var_2());
-
printf("%s\n", tst_var_3());
-
- char *tmp = tst_var_4();
printf("%s\n", tmp);
free(tmp);
-
-
char *res = (char *)malloc(128);
-
memset(res, 0, 128);
-
tst_var_5(res);
-
printf("%s\n",res);
-
-
free(res);
-
return 0;
-
}
3:结果(你能想想到吗)
- xdzh@xdzh-laptop:/media/home/work/c$ gcc -Wall -O2 -o tst-auto tst-auto.c
-
tst-auto.c: In function ‘tst_var_0’:
-
tst-auto.c:10: warning: function returns address of local variable
-
xdzh@xdzh-laptop:/media/home/work/c$ ./tst-auto
-
hello
-
hello
-
hello
-
hello
-
hello
-
hello
-
xdzh@xdzh-laptop:/media/home/work/c$ gcc tst-auto.c
-
tst-auto.c: In function ‘tst_var_0’:
-
tst-auto.c:10: warning: function returns address of local variable
-
xdzh@xdzh-laptop:/media/home/work/c$ ./a.out
-
h@
-
hello
-
hello
-
hello
-
hello
-
hello
第一编译我们采用了优化模式,虽然产生了警告,但是我们得到了正确的结果,第二次编译器不干了,很遗憾。
4:注
我们看到有很多中方法避免返回乱码的局部变量。
- 返回一个指向字符串常量的指针,(简单,局限性大)
- 使用全局变量 (不推荐,容易在别的地方被改)
- 静态数组(静态变量有自己的存储区,不在栈上分配空间)
- 显式分配内存(记得释放阿,内存泄漏)
- 把分配内存的任务留给调用者(推卸责任,不过方法很好)
阅读(2129) | 评论(0) | 转发(2) |