用指针作为函数返回值时需要注意的一点是,函数运行结束后会销毁在它内部定义的所有局部数据,包括局部变量、局部数组和形式参数,函数返回的指针请尽量不要指向这些数据,C语言没有任何机制来保证这些数据会一直有效,它们在后续使用过程中可能会引发运行时错误。
错误代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define QW "quit"
char *ar(char *p){
char q[100];
char *qq;
qq=q;
int i=1;
int len_str=strlen(p);
do{
*qq=*(p+strlen(p)-i);
i++;
qq++;
}while(i<=strlen(p));
*qq='\0';
return q;//返回函数内部定义数组的指针
}
int main(void){
char t[100];
char *w;
printf("输入字符串:");
while(strcmp(gets(t),QW)){
w=ar(t);
printf("%s\n",w);
printf("输入字符串:");
}
return 0;
}
函数运行完后q[100]空间释放(不可控) 运行结果错误!!!!!
作为对比,将q[100]定义为全局变量
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define QW "quit"
char q[100];//全局的变量
char *ar(char *p){
//char q[100];
char *qq;
qq=q;
int i=1;
int len_str=strlen(p);
do{
*qq=*(p+strlen(p)-i);
i++;
qq++;
}while(i<=strlen(p));
*qq='\0';
return q;
}
int main(void){
char t[100];
char *w;
printf("输入字符串:");
while(strcmp(gets(t),QW)){
w=ar(t);
printf("%s\n",w);
printf("输入字符串:");
}
return 0;
}
结果是正确的。
指针作为函数返回值时需要注意的一点是,函数运行结束后会销毁在它内部定义的所有局部数据,包括局部变量、局部数组和形式参数,使用时要注意这一点。