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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

go语言基础之工程管理和工作区介绍

1、工程管理 在实际的开发工作中&#xff0c;直接调用编译器进行编译和链接的场景是少而又少&#xff0c;因为在工程中不会简单到只有一个源代码文件&#xff0c;且源文件之间会有相互的依赖关系。如果这样一个文件一个文件逐步编译&#xff0c;那不亚于一场灾难。 Go语言的设计…

用临时表的GridView分页

本例子采用sql2000下的Nowthwind数据库中的[Order Details]表 下面是存储过程脚本 Code1ALTER PROC OrderDetailsPaging 2(PageIndex int,--页码 3 PageSize int,--页尺寸 4 RowsCount int output)--总行数 5AS 6BEGIN 7set nocount on 8declare PageLowerBound int 9declar…

HTML与CSS(图解6):超链接

动态的超链接&#xff1a; <html> <head> <title>动态超链接</title> <style> <!-- body{background:url(bg9.gif); /* 页面背景图片 */margin:0px; padding:0px;cursor:pointer; /*意思就是鼠标指针变成 手 的形状&#xff0c;和放到链…

pointcut 切面表达式 切入点表达式

下面给出一些常见切入点表达式的例子。 任意公共方法的执行&#xff1a; execution(public * *(..)) 任何一个以“set”开始的方法的执行&#xff1a; execution(* set*(..)) AccountService 接口的任意方法的执行&#xff1a; execution(* com.xyz.service.AccountService.*…

keil分散加载文件浅析

什么是分散加载文件分散加载文件&#xff08;scatter file&#xff09;是一个文本文件&#xff0c;它的作用是可以用于描述 ARM 链接器生成映像文件所需要的信息。如果不使用 scatter file 文件来指定&#xff0c;那么 ARM 链接器会按照默认的方式来生成映像文件&#xff0c;但…

socket buffer套接字缓存

最近公司在开发机器人与服务器调度端的通信时需要使用socket&#xff0c;因此找到了该文章作为深刻理解socket内部运作。 Linux网络核心数据结构是套接字缓存(socket buffer)&#xff0c;简称skb。它代表一个要发送或处理的报文&#xff0c;并贯穿于整个协议栈。 1、 套接字…

LAMP 系统性能调优,第 3 部分: MySQL 服务器调优(转)

关于 MySQL 调优 有 3 种方法可以加快 MySQL 服务器的运行速度&#xff0c;效率从低到高依次为&#xff1a; 替换有问题的硬件。对 MySQL 进程的设置进行调优。对查询进行优化。迁移到 DB2? 您正在寻找一种干净利落、无成本的方法用来从 MySQL 迁移到 IBM? DB2? 吗&#xf…

Python--day 3

1 # -*- coding:utf-8 -*-2 # Author:Monarch-T3 4 for 循环5 for i in range(10):6 print("Loop:", i)7 8 for i in range(0, 10, 2): #步长29 continue 跳出本次循环进入下次循环 10 break 结束循环 转载于:https://www.cnblogs.com/Monarch-T/p/10245724…

C语言中的常用文件操作

原文链接 常常觉得&#xff0c;我对很多东西都是要求会用就好&#xff0c;不求甚解。比如说每次一遇到文件操作&#xff0c;我必要查查相关的API和例子&#xff0c;然后依样画葫芦写下来。或许正是因为这种不求甚解的态度&#xff0c;让我一直处于半桶水的状态。看完了《C专家编…

圆梦,手写了个操作系统

大家好&#xff0c;我是发哥。我不止一次在公众号上强调学习操作系统的重要性。至于学习的方法&#xff0c;无外乎看书、看视频、看源码等等。也有推荐过跟着老师一起手写操作系统&#xff0c;但很少有学习方法能同时兼顾以下三点&#xff1a;1、Linux内核2、Windows内核3、自己…

Socket api接口--Send(),Recv()的长度问题

一个包没有固定长度&#xff0c;以太网限制在46&#xff0d;1500字节&#xff0c;1500就是以太网的MTU&#xff0c;超过这个量&#xff0c;TCP会为IP数据报设置偏移量进行分片传输&#xff0c;现在一般可允许应用层设置8k&#xff08;NTFS系统&#xff09;的缓冲区&#xff0c;…

安卓打包apk

打apk包的环境依赖 1.jdk 2.sdk 3.ndk 打apk包的工具 gradle mkdir /usr/local/Android cd /usr/local/Android mkdir sdk gradle ndk 1.jdk安装 略 2.sdk安装 https://www.androiddevtools.cn/下载地址 cd /usr/local/Android/sdk wget https://dl.google.com/android/andro…

收集最全的Joomla教材网站和joomla模板网站

http://www.seonote.net/joomla/the-most-complete-collection-of-joomla-sites-and-joomla-templates-website-materials.html 这篇文章算是为joomla学习者而准备的&#xff0c;包括了适合初学者学习的教材网站、国内比较好的joomla学习网 站以及几个比较好的joomla模板网站&a…

你知道怎么衡量硬件设备的算力吗?

前几天在知乎上看到有知友提问&#xff0c;什么是 GPU 算力。当时简单回答了一下&#xff0c;今天有空&#xff0c;在这里详细谈谈算力。算力也是做高性能计算的核心概念和指标。设备算力分为两部分&#xff0c;其一是设备&#xff0c;其二是算力。设备主要是指 CPU、GPU、DSP、…

socket api中send()和recv()函数工作原理与要点

send()和recv()函数是网络编程中经常使用到的函数&#xff0c;下面详细的比较两者的不同之处 send函数工作原理&#xff1a;send函数只负责将数据提交给协议层。 当调用该函数时&#xff0c;send先比较待发送数据的长度len和套接字s的发送缓冲区的长度&#xff0c;如果len大于s…

Python爬虫入门教程 22-100 CSDN学院课程数据抓取

1. CSDN学院课程数据-写在前面 今天又要抓取一个网站了&#xff0c;选择恐惧症使得我不知道该拿谁下手&#xff0c;找来找去&#xff0c;算了&#xff0c;还是抓取CSDN学院吧&#xff0c;CSDN学院的网站为 https://edu.csdn.net/courses 我看了一下这个网址&#xff0c;课程数量…

UML类图解义 (来自《大话设计模式》)

为什么80%的码农都做不了架构师&#xff1f;>>> 小菜&#xff1a;“对了&#xff0c;我时常在一些技术书中看到这些类图表示&#xff0c;简单的还看得懂&#xff0c;有些标记我很容易混淆。要不你给我讲讲吧。” 大鸟&#xff1a;“这个其实多看多用就熟悉了。我给…

易写易库(EXEK)玩“花”儿之三:命令有图标支持库,附图

释题&#xff1a;如果您认为这个“花”儿&#xff0c;属于之前第一个“花”儿的变种&#xff0c;易语言写支持库也能玩出“花”儿来&#xff08;易写易库(EXEK)进展5&#xff09;&#xff0c;我也不反对。 在开始正文之前&#xff0c;我要首先回答我之前提出的两个问题&#xf…

您好,有什么嵌入式书籍推荐的?

回答下这个后台的留言-----比较推荐下面这个仓库里面的内容&#xff01;https://github.com/ZhongYi-LinuxDriverDev/CS-EmbeddedLinux-Book#%E5%85%A8%E9%83%A8%E6%B1%87%E6%80%BB

闭包的功能举例

闭包可以在函数外部或者其他函数内,访问本函数内的变量: 闭包可以使变量持久,常驻内存,又可以避免变量被外部修改 1 def func():2 name "大傻子" #定义个name "大傻子"3 def func1():4 return name #把name返回给…