strdup与strcpy具体的区别

 我分别在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 使用的时候,必须已经拥有了足够的空间才行。

你可能感兴趣的:(其它)