字符串复制函数strdup和_strdup

字符串复制函数strdup和_strdup

函数原型

#include <string.h>
char *strdup(const char *s); 

strdup()函数是c语言中常用的一种字符串拷贝库函数,一般和free()函数成对出现。

strdup()在内部调用了malloc()为变量分配内存,不需要使用返回的字符串时,需要用free()释放相应的内存空间,否则会造成内存泄漏。该函数的返回值是返回一个指针,指向为复制字符串分配的空间;如果分配空间失败,则返回NULL值。

记得要用free()释放内存!!!

函数实现:

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

应用:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    char* str="bdhf";
    char* des;
    des=_strdup(str);
    cout<<des<<endl;
    free(des);
    return 0;
}

char*可以string不可以用

但是char[]数组和char*可以

#include<bits/stdc++.h>
using namespace std;
int main()
{
    char str[4]={'b','d','f','d'};
    char*des;//string依旧不可以
    des=_strdup(str);
    cout<<des<<endl;
    free(des);
    return 0;
}

strdup和_strdup的区别:

strdup是POSIX: _strdup是Windows特定: 在Unix上,使用的strdup。

在windows上两者均可;

使用malloc动态分配内存:

以double为例

double *x=(double *)malloc(sizeof(double));//对于非字符串用sizeof
double *x=(double *)malloc(10*sizeof(double));
double *x=(double *)malloc(8);//也可直接写数字,但是不建议
//对于字符串不建议使用sizeof
char* s="hdifn";
char* des=(char *)malloc(strlen(s)+1);//用strlen确定字符串长度并加1来为字符串结束符留出空间
strcpy(des,s);//将s的内容复制到des

直接使用malloc来复制字符串容易忘记分配地址空间,可以编译通过但可能会中途失败

例如:

char* s="hdifn";
char* des;//没有给des分配内存,那么只是在栈空间的一个字符指针的大小,而不能容纳s的内容
strcpy(des,s);

直接由int等定义的变量的位置在栈空间中,而通过malloc、new等由动态分配的内存是存在于可以有程序员支配的堆空间中,char* des=(char *)malloc(strlen(s)+1)中des存在于栈空间,存的是动态分配的处于堆空间中的地址。

其他:

在不同的平台上,我们对于strdup内存分配的函数可能采用不同的方法,比如在某些c库中用malloc来分配,而在某些c++库中,用new来分配 (因为c++库可能重写了相关的c库代码)。所以对使用者在释放它的时候产生了很大的疑惑,是用free还是用delete[]来释放所分配的内存呢?! 如果我们主管臆断,用free来释放它,操作未知。可能工作正常,可能是部分内存泄漏,也可能是程序崩溃。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值