措施一:
int main()
{
int *p;
int i;
int*fun(void);
p=fun();
for(i=0;i<3;i++)
{
printf("%d\n",*p);
p++;
}
return 0;
};
int* fun(void)
{
static int str[]={1,2,3,4,5};
int*q=str;
return q;
}
//不能正确返回
固然str是在动态变量区,而该动态变量是局部的,函数竣事时不保存的。
措施二:
int main()
{
char *p;
char*fun(void);
p=fun();
printf("%s\n",p);
return 0;
};
char * fun(void)
{
char *str="hello";
return str;
}
//可以正确返回
可是,字符串"hello"不是变量,而是一个常量,编译措施在处理惩罚这种常量时,凡是把它放在了常量区中。而常量区则是始终存在的。
后一个例子中函数fun的返回值就是一个指向这种常量区的指针。
函数返回指针,要使主措施可以利用这个指针来会见有意义的数据,要害就是要担保在利用这个指针值的时候,该指针所指向的处所的数据仍然有意义。
尚有,假如指针是指向函数的指针,那么这个指针就是指向措施代码区的。这也是一种应用的环境。
别的,假如大白了它的道理,措施员还可以发现出一些其他机动的利用要领,虽然,那都属于“怪”要领,一般不倡导的。
措施三:
int main()
{
int a,b;
int max;
int fun (int a,int b);
scanf("%d%d",&a,&b);
max=fun (a,b);
printf("\n%d\n",max);
return 0;
};
//http://www.bianceng.cn int fun(int a,int b)
{
int max;
if(a>b)
max=a;
else
max=b;
return max;
}
//可以正确返回
措施三:
这个例子中,返回的不是变量max的地点,返回的是它的值。
return后头的对象,看做一个表达式,返回的是这个表达式的值。
譬喻,进口假如a是3,b是5,则此时(执行return语句时)max内里存的是5。而return语句的成果就是把max内里的5取出来,放到“返回值寄存器”中。
主措施是从“返回值寄存器”获得这个5的(此时max变量已经不存在了)。
你前面的第二个例子中,同样,指针变量str在函数竣事后已经不存在了。可是在return语句中,把指针变量str内里的值(便是字符串"hello"存放处的地点)送到“返回值寄存器”中了。
动态变量str不存在了,但常量区中的字符串"hello"还存在。主措施按照返回的地点就可以找到该字符串。
措施四:
int main()
{
char *p;
char *fun(void);
p=fun();
printf("%x\n",p);
printf("%s\n",p);
return 0;
}
char* fun(void)
{
// char str[]={'a','b','c','d','e','f','\0'};
char str[]="hello";
printf("%x\n",str);
return str;
}
//不能正确返回
char str[]="hello"; 是在动态变量区中开发了可以容纳6个字符的数组,数组名叫str。同时将字符串"hello"(原存放于常数空间)拷贝到这个数组空间中去作为数组的初始化值。
此时若执行return str; 个中的str是数组名。C语言划定,表达式中假如是数组名,则该表达式的值就便是这个数组的地点。所以返回的是这个数组的地点,请留意:并不是字符串常量"hello"的地点!而函数竣事时,固然常数空间并不粉碎,但这个数组空间是粉碎了的,而你返回的却不是常数空间里的地点而正是已经粉碎了的数组的地点。
而char *str="hello"; 是在动态变量区中开发了一个可以存放一个指针值的变量,名叫str。同时将原存放于常数空间的字符串"hello"的地点赋给这个指针变量作为初始值。
此时若执行return str; 个中的str是指针变量名。C语言划定,表达式中假如是变量名,则该表达式的值就便是这个变量的值(指针变量的值就是地点)。所以返回的是变量str的值,而变量str的值就便是字符串常量"hello"的地点。而函数竣事时,变量str粉碎了的,但常数空间中的字符串并不粉碎。主措施按照返回的地点就可以找到该字符串。
【总结】
通例措施中,函数返回的指针凡是应该是:
(1)指向静态(static)变量;
(2)指向专门申请分派的(如用malloc)空间;
(3)指向常量区(如指向字符串"hello");
(4)指向全局变量;
(5)指向措施代码区(如指向函数的指针)。
除这5项以外,其它怪能力不倡导。
#p#分页标题#e#
函数内的变量,没有要害字static修饰的变量的生命周期只在本函数内,函数竣事后变量自动销毁。当返回为指针的时候需要出格留意,因为函数竣事后指针所指向的地点依然存在,可是该地点可以被其他措施修改,内里的内容就不确定了,有大概后头的操纵会继承用到这块地点,有大概不会用到,所以会呈现时对时错的环境,假如需要返回一个指针而又不堕落的话只能挪用内存申请函数
返回布局体:
#include <stdio.h>
typedef struct {
int a;
int b;
int c;
}str;
str change(str s)
{
s.a += 1;
s.b += 1;
s.c += 1;
return s;
}
int main(void)
{
str s1, s2;
s1.a = 1;
s1.b = 1;
s1.c = 1;
s2 = change(s1);
printf("s1.a = %d\ts1.b = %d\ts1.c = %d\n",s1.a, s1.b, s1.c);
printf("s2.a = %d\ts2.b = %d\ts2.c = %d\n",s2.a, s2.b, s2.c);
return 0;
}
//可以返回