Chinaunix首页 | 论坛 | 博客
  • 博客访问: 209947
  • 博文数量: 87
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 798
  • 用 户 组: 普通用户
  • 注册时间: 2015-01-14 14:54
文章分类

全部博文(87)

文章存档

2015年(87)

我的朋友

分类: C/C++

2015-02-06 14:46:53

我分别在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 使用的时候,必须已经拥有了足够的空间才行。
阅读(1343) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~