指针型函数的返回值,应该是变量地址、数组首地址或者已经定向的指针变量,也可以是结构变量地址、结构数组的首地址。并且要着重注意的是不能将该函数内部局部变量的地址作为返回值,因为在函数调用结束之后,函数内部的局部变量就自动消失了,存放它们的空间也就被释放了。
之前在参考书中看到的一个例子,来说明这个问题正好:
#include <stdio.h>
char *strcut(char *s, int m, int n);
void main(){
char s[] = "goodmorning";
char *ps;
ps = strcut(s, 3, 4);
printf("%s\n", ps);
}
char *strcut(char *s, int m, int n){
char substr[20];
int i;
for(i=0;i<n;i++){
substr[i]=s[m+i-1];
}
substr[i]='\0';
return substr;
}
运行上述程序时,会发现ps并不能接收到函数返回的子数组的正确地址,原因很简单,因为在函数定义中,substr是函数内部的变量,当函数执行完之后,该地址就释放了,最后return的当然就不是正确地址了。
而修改这个函数的方法也很简单,只需要将substr改为全局寿命的static类型就行。
static char strsub[20];