字符串(一)

2021-11-17  本文已影响0人  iMikasa_

字符串作为函数的返回值

函数中声明的字符数组是局部变量

#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;
}
上一篇下一篇

猜你喜欢

热点阅读