我分别在XP的环境和linux环境下编译运行C代码,我发现一个不解的现象:
现象描述:
两个字符串 char* from, char* to;要把from的内容复制给to。
我在XP下,用strcpy(to, from)出现memory问题,于是换成
to = strdup(from),就运行正常。
而在linux下,用to = strdup(from)出现memory问题(报错信息:* glibc detected *** free(): invalid next size (fast): 0x09a8d868 ***),于是换成strcpy(to, from),就运行正常。
请大家指教:
1,如何解释我遇到的这种现象;
2,strdup与strcpy具体的区别,以及在不同操作系统下的使用。
谢谢!
strdup
原型:extern char *strdup(char *s);
用法:#include <string.h>
功能:复制字符串s
说明:返回指向被复制的字符串的指针,所需空间由malloc()分配且可以由free()释放。
举例:
// strdup.c
#include <syslib.h>
#include <string.h>
main()
{
char *s="Golden Global View";
char *d;
clrscr();
d=strdup(s);
printf("%s",d);
getchar();
return 0;
}
strcpy
原型:extern char *strcpy(char *dest,char *src);
用法:#include <string.h>
功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
举例:
// strcpy.c
#include <syslib.h>
#include <string.h>
main()
{
char *s="Golden Global View";
char d[20];
clrscr();
strcpy(d,s);
printf("%s",d);
getchar();
return 0;
}
从手册里copy的!~函数名: strdup
功 能: 将串拷贝到新建的位置处
用 法: char *strdup(char *str);
程序例:
-
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 ; }
函数名: strcpy
功 能: 串拷贝
用 法: char *strcpy(char *str1, char *str2);
程序例:
-
C/C++ code
-
#include < stdio.h > #include < string .h > int main( void ) { char string [ 10 ]; char * str1 = " abcdefghi " ; strcpy( string , str1); printf( " %s/n " , string ); return 0 ; }
strdup不是标准的c函数,所以linux会报错!~
strcpy是标准的c函数,在windows里报错是因为指针没申请空间吧!~
可以先strlen判断from的大小,之后为to申请空间,之后再strcpy就不会报错了!~
strdup可以直接把要复制的内容复制给没有初始化的指针,因为它会自动分配空间给目的指针
strcpy的目的指针一定是已经分配内存的指针
请问:用to = strdup(from)后,应该必须用free(to)吧,谢谢
linux下的c是ansi c,strdup不是标准库函数
strdup用完要free否则 内存泄露
strcpy拷贝到你分配的内存
strdup 内部在堆上创建了一个备份,所以即使没看到malloc也应该在使用完毕后得自己手动释放(free);
strcpy 使用的时候,必须已经拥有了足够的空间才行。