strdup

转载 2016年05月31日 10:48:41

 

函数名: strdup

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

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

 

这个函数在linux的man手册里解释为:

The strdup() function returns a pointer toa new string which is a

duplicate of the string s. Memory for thenew string is obtained with

malloc(3), and can be freed with free(3).

The strndup() function is similar, but onlycopies at most n charac-

ters. If s is longer than n, only ncharacters are copied, and a termi-

nating NUL is added.

 

strdup函数原型:

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

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\n", 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\n",(char*)pch);

free((void*)pch);

return 0;

}

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

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

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

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

栈是由编译器来管理的。

系统函数C字符串的实现(5):strdup

strdup不需要分配内存空间,自动实现字符串的拷贝 char *mystrdup(char *str) { char*p = malloc(sizeof(char)*(strlen(str) +...
  • zhouruifu2015
  • zhouruifu2015
  • 2015年08月15日 22:40
  • 449

strcpy和strdup比较和详解

strcpy和strdup比较和详解 函数和功能描述: ①extern char *strdup(char *s); 头文件:string.h 功能: 将串拷贝到新建的位置处 说 明:strdup不是...
  • koozxcv
  • koozxcv
  • 2015年10月21日 16:49
  • 3084

VS编程问题-warning C4996: ’strdup’

VS在编程时出现warningC4996: 'strdup': The POSIX name for this item is deprecated. Instead, use theISO C++ ...
  • smilehehe110
  • smilehehe110
  • 2017年01月17日 10:08
  • 604

linux C函数之strdup函数分析

linux C函数之strdup函数分析一.函数分析1.函数原型:#include char *strdup(const char *s); 2.功能:strdup()函数主要是拷贝字符串s的一个...
  • tigerjb
  • tigerjb
  • 2013年10月16日 19:17
  • 9381

strdup 和 _strdup 的使用及区别

这两者很让人头疼,虽然现在用的是C++编程,但是有时候移植一些第三方库,要是用C语言写的,就有可能遇到这个问题。今天去详细了解了一下。 先看看它们的使用介绍(二者用法一样,就是出现的环境不一...
  • u010977122
  • u010977122
  • 2016年11月03日 13:02
  • 3561

strdup()函数实现

#include #include #includechar * my_strdup(char *src); char *my_strdup(char *src) { if(NULL == s...
  • qq_32744005
  • qq_32744005
  • 2016年07月29日 17:25
  • 819

_strdup()函数

 Duplicate strings.char *_strdup( const char *strSource );wchar_t *_wcsdup( const wchar_t *strSo...
  • Very_2
  • Very_2
  • 2011年06月08日 15:57
  • 4456

strdup与strcpy具体的区别

 我分别在XP的环境和linux环境下编译运行C代码,我发现一个不解的现象: 现象描述: 两个字符串 char* from, char* to;要把from的内容复制给to。 我在XP下,用strcp...
  • yaoliang11
  • yaoliang11
  • 2009年05月09日 19:59
  • 20713

strdup详解和模拟实现

模拟实现strdup。strdup和strcpy的区别。strdup函数介绍函数原型:char* strdup(const char* str)函数功能:将串拷贝到新建的位置处 返回值:返回一个指针...
  • gebushuaidanhenhuai
  • gebushuaidanhenhuai
  • 2017年08月07日 09:57
  • 164

忘记strdup吧

最近在看别人编写的c语言源代码,很多人喜欢使用strdup来复制字符串,我觉得这个习惯不好,因为如果想使自己的程序移植性更好的话,就忘记有这个函数吧。我否定它的主要原因是:1)用strdup函数的时候...
  • hello_wyq
  • hello_wyq
  • 2006年06月16日 16:06
  • 10823
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:strdup
举报原因:
原因补充:

(最多只允许输入30个字)