字符串复制函数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来释放它,操作未知。可能工作正常,可能是部分内存泄漏,也可能是程序崩溃。