美文网首页
字符串(一)

字符串(一)

作者: iMikasa_ | 来源:发表于2021-11-17 09:28 被阅读0次

    字符串作为函数的返回值

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

    #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;
    }
    

    相关文章

      网友评论

          本文标题:字符串(一)

          本文链接:https://www.haomeiwen.com/subject/nuqktrtx.html