字符串作为函数的返回值
函数中声明的字符数组是局部变量
#include <stdio.h>
char *test_string();
int main(int argc, char const *argv[])
{
printf("%s\n",test_string());
return 0;
}
char * test_string(){
char str[] = "abcdefg";
return str;
}
我们编译程序发现警告,如下图
image.png
警告告诉我们函数返回的是局部变量的地址,我们为什么不能返回局部变量的地址呢?因为当函数执行完毕后,函数内声明的变量都会被销毁,所以不能返回局部变量;那我们如何返回字符串呢?我们可以返回通过指针声明的字符串,他就是字符串常量的地址,而字符串常量是常量,直到程序结束才会被销毁,说以可以正常的作为函数的返回值,如下代码
#include <stdio.h>
char *test_string();
int main(int argc, char const *argv[])
{
printf("%s\n",test_string());
return 0;
}
char * test_string(){
char *str = "abcdefg";
return str;
}
程序可以正常编译运行.....
其他返回字符串的方式
使用static
用static修饰字符数组,函数返回静态局部变量,如下
#include <stdio.h>
#include <string.h>
#define LEN 40
char *test_string(char *s);
int main(int argc, char const *argv[])
{
printf("%s\n",test_string("abcd"));
printf("%s\n",test_string("hello"));
return 0;
}
char * test_string(char *s){
static char str[LEN];
strcpy(str,s);
return str;
}
使用全局变量
这个很好理解。全局变量在程序真个生命周期中都是有效的,所以使用全局变量也可以解决类似问题。
但是这种方案就会让这个封装的方法耦合了,因为它依赖了全局变量。
#include <stdio.h>
#include <string.h>
#define LEN 40
char *test_string(char *s);
char *all_str;
int main(int argc, char const *argv[])
{
printf("%s\n","hello");
return 0;
}
char * test_string(char *s){
strcpy(all_str,s);
return all_str;
}
使用malloc
使用malloc函数动态分配,但是一定要注意在主调函数中将其释放,应为malloc动态分配的内存位于堆区,而堆区的内存是要程序员自己释放的。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LEN 40
char *test_string(char *s);
int main(int argc, char const *argv[])
{
char *str = test_string("hello world");
printf("%s\n",str);
free(str);
return 0;
}
char * test_string(char *s){
char * str ;
str = (char *)malloc(strlen(s)*sizeof(char));
strcpy(str,s);
return str;
}
网友评论