#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#if defined _LIBC || defined STDC_HEADERS
# include <stdlib.h>
# include <string.h>
#else
char *malloc ();
char *memcpy ();
#endif
#undef __strdup
#undef strdup
#ifndef weak_alias
# define __strdup strdup
#endif
/* Duplicate S, returning an identical malloc'd string. */
/**
* strdup()主要是拷贝字符串s的一个副本,
* 由函数返回值返回,这个副本有自己的内存空
* 间,和s不相干。strdup函数复制一个字符
* 串,使用完后要记得删除在函数中动态申请的
* 内存,strdup函数的参数不能为NULL,
* 一旦为NULL,就会报段错误,因为该函数包
* 括了strlen函数,而该函数参数不能是NULL。
*/
/**
* strdup()在内部调用了malloc()为变量分配内存,不需要使用返回的字符串时,
* 需要用free()释放相应的内存空间,否则会造成内存泄漏。
*/
char *
__strdup (const char *s)
{
//此处使用了strlen(s),所以s不能为NULL
//+1的原因是,字符串后面还有'\0',但是strlen求出的长度是不包含'\0'字符的。
size_t len = strlen (s) + 1;
void *new = malloc (len);
if (new == NULL)
return NULL;
/* strlen(s)计算的长度不包含,'\0', 所以len = strlen(s)+1,这样
* 在执行malloc才能分配足够的空间,memcpy才能够将'\0'字符也复制过
strdup源码分析
最新推荐文章于 2025-01-23 21:29:29 发布