• strdup函数


    strdup函数原型:

    strdup()主要是拷贝字符串s的一个副本,由函数返回值返回,这个副本有自己的内存空间,和s不相干。strdup函数复制一个字符串,使用完后要记得删除在函数中动态申请的内存,strdup函数的参数不能为NULL,一旦为NULL,就会报段错误,因为该函数包括了strlen函数,而该函数参数不能是NULL。


    函数名: strdup

    功  能: 将串拷贝到新建的位置处

    用  法: char *strdup(char *str);



    strdup的工作原理:

    char * __strdup (const char *s)
    {
    size_t len =strlen (s) + 1;
    void *new =malloc (len);
    if (new == NULL)
    return NULL;
    return (char *)memcpy (new, s, len);
    }


     

    实例1:

    //C/C++ code
    #include <stdio.h>
    #include <string.h>
    #include <alloc.h>
    int main(void)
    {
    char *dup_str,*string = "abcde";
    dup_str =strdup(string);
          printf("%s
    ", dup_str);free(dup_str); return 0;
    }

    实例2:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    unsigned int Test()
    {
    charbuf[]="Hello,World!";
    char* pb =strndup(buf,strlen(buf));
    return (unsignedint)(pb);
    }
     
    int main()
    {
    unsigned int pch= Test();
    printf("Testing:%s
    ",(char*)pch);
    free((void*)pch);
    return 0;
    }


    在Test函数里使用strndup而出了Test函数仍可以操作这段内存,并且可以释放。

    由这个问题而延伸出来的问题就是,如何让函数得到的内存数据传出函数但仍可用。

    解决方法目前本人只想到两个: 一个外部变量,如传递一个内存块指针给函数,但这种做法就是你得传递足够的内存,也就是你不能事先知道这个函数到底要多大的BUFFER。


     另一种方法就是在函数内部申请static变量,当然这也是全局区的变量,但这种做法的缺点就是,当函数多次运行时,static变量里面的数据会被覆盖。这种类型的另一个方法就是使用全局变量,但这和使用static变量很相同,不同的是全局变量可以操作控制,而static变量如果不把它传出函数,就不可对它操作控制了。另一类方法就是上面所述的,利用堆里的内存来实现,但存在危险。strdup是从堆中分配空间的!strdup调用了malloc,所以它需要释放!对于堆栈:堆是由程序员来管理的,比如说new,malloc等等都是在堆上分配的!

    栈是由编译器来管理的。

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    DGA域名可以是色情网站域名
    使用cloudflare加速你的网站隐藏你的网站IP
    167. Two Sum II
    leetcode 563. Binary Tree Tilt
    python 多线程
    leetcode 404. Sum of Left Leaves
    leetcode 100. Same Tree
    leetcode 383. Ransom Note
    leetcode 122. Best Time to Buy and Sell Stock II
    天津Uber优步司机奖励政策(12月28日到12月29日)
  • 原文地址:https://www.cnblogs.com/yangquanhui/p/4937507.html
Copyright © 2020-2023  润新知