脑动力:C语言函数速查效率手册
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.1.3 复制字符串到最近申请的单元strdup()

【函数原型】char* strdup(char* s)

【功能讲解】复制字符串s,返回值为指向复制字符串的指针,所需的空间由malloc()分配,需要函数free()释放。

【参数说明】被复制的字符地址。

【程序示例】本例程展示如何使用strdup复制字符串,并且一定要记得释放本函数申请的内存空间,否则会造成内存泄露。

      /*函数strdup()示例*/
      #include<string.h>
      #include<stdio.h>
      #include<stdlib.h>
      /*定义函数[使用strdup()复制字符串*/
      unsigned int TestCopy()
      {
        char buf[] = "Do not forget free me!";
        char* res_p = strdup(buf);        /*复制*/
        printf("Copy:%s\n",res_p);
        return (unsigned int)(res_p);     /*直接返回[没有释放*/
      }
      int main(void)
      {
        /*调用函数TestCopy()[得到复制的字符串指针*/
        unsigned int pch = TestCopy();
        printf("Warning:%s\n",(char*)pch);/*显示出来*/
        free((void*)pch);/*释放内存*/
        return 0;
      }

【运行结果】

      Copy:Do not forget free me!
      warning:Do not forget free me!

【实例讲解】本例首先定义了一个函数TestCopy(),此函数内部调用strdup()复制字符串,然后显示复制的结果,但是并没有释放内存,而是把函数内部申请的指针当做了函数的返回值。在main()函数中再次打印该指针,还能显示同样的内容,说明内存没有被自动释放,需要手动释放该内存,否则会造成内存泄露!不过该函数不会自动释放内存也有一个好处,就是函数内部申请的数据可以传到函数外继续使用,而不用定义全局变量之类的方法来实现此功能。记得无论如何,最后一定要释放内存。