看来虽然平时别人说C与java差不多,但实现操作起来,还是挺不习惯的,对于我这个本来就是java的程序员来说,写C的时候还是很多地方不同的.
今天就遇到这样的一奇怪的问题了,很简单,只需返回方法体内的一个字符串.
#include <stdio.h>
char* fun(char *src);
int main()
{
char *c = "hello linux c!!";
char *t = NULL;
t = fun(c);
printf("result:%s\n",t);
return 0;
}
{
char *c = "hello linux c!!";
char *t = NULL;
t = fun(c);
printf("result:%s\n",t);
return 0;
}
char* fun(char *src)
{
if(src == NULL)
{
return NULL;
}
char c[] = "hello";
return c;
{
if(src == NULL)
{
return NULL;
}
char c[] = "hello";
return c;
}
这个已经简单不过的程序了,只仅仅返回方法内部的一个字符串,编译时却提示
kernaling.wong@linux-i5re:~/devlop> gcc -o test1 test1.c
test1.c: In function ‘fun’:
test1.c:21: warning: function returns address of local variable
test1.c: In function ‘fun’:
test1.c:21: warning: function returns address of local variable
意思说返回了内部变量的地址
在java的角度来说,这个肯定没有问题的,返回方法内部的对象绝对可行的
但C语言并不卖帐...
把方法改为
char* fun(char *src)
{
if(src == NULL)
{
return NULL;
}
{
if(src == NULL)
{
return NULL;
}
//char c[] = "hello";
char *c = "hello"; //仅仅修改这里,编译不但通过而且运行正确
return c;
return c;
}
这里就比较涉及程序语言方法体与方法参数入栈与出栈的问题了,当方法执行完后
所有的方法内定义的变量与方法都已经全部出栈了,所以如果定义
char c[] = "hello" 的话,变量与值都是存放在此时这个方法的栈里,方法执行完成要
return的时候,这样char c[] = "hello" 的变量都已经被弹出栈了,已经不存在了.所以编译时会提示使用方法内部的变量地址,但为什么定义成char *c = "hello"却没有问
题呢?那是因为char *c = "hello" 是的hello是一个字符常量,当然是定义在一个叫
内存的常量区中,不受程序方法返回影响.这个类似于java里的一个叫字符串池的
概念了...
转载于:https://blog.51cto.com/kernaling/211337