strdup函数的用法

函数名: strdup

功  能: 将串拷贝到新建的位置处

用  法: char *strdup(char *str);

 

这个函数在linux的man手册里解释为:

The strdup() function returns a pointer toa new string which is a

duplicate of the string s. Memory for thenew string is obtained with

malloc(3), and can be freed with free(3).

The strndup() function is similar, but onlycopies at most n charac-

ters. If s is longer than n, only ncharacters are copied, and a termi-

nating NUL is added.

 

strdup函数原型:

strdup()主要是拷贝字符串s的一个副本,由函数返回值返回,这个副本有自己的内存空间,和s不相干。strdup函数复制一个字符串,使用完后要记得删除在函数中动态申请的内存,strdup函数的参数不能为NULL,一旦为NULL,就会报段错误,因为该函数包括了strlen函数,而该函数参数不能是NULL。

strdup的工作原理:

char * __strdup (const char *s)

{

size_t len =strlen (s) + 1;

void *new =malloc (len);

if (new == NULL)

return NULL;

return (char *)memcpy (new, s, len);

}

 

实例1:

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;

}

 

实例2:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

unsigned int Test()

{

charbuf[]="Hello,World!";

char* pb =strndup(buf,strlen(buf));

return (unsignedint)(pb);

}

 

int main()

{

unsigned int pch= Test();

printf("Testing:%s\n",(char*)pch);

free((void*)pch);

return 0;

}

在Test函数里使用strndup而出了Test函数仍可以操作这段内存,并且可以释放。

由这个问题而延伸出来的问题就是,如何让函数得到的内存数据传出函数但仍可用。

解决方法目前本人只想到两个: 一个外部变量,如传递一个内存块指针给函数,但这种做法就是你得传递足够的内存,也就是你不能事先知道这个函数到底要多大的BUFFER。

 另一种方法就是在函数内部申请static变量,当然这也是全局区的变量,但这种做法的缺点就是,当函数多次运行时,static变量里面的数据会被覆盖。这种类型的另一个方法就是使用全局变量,但这和使用static变量很相同,不同的是全局变量可以操作控制,而static变量如果不把它传出函数,就不可对它操作控制了。另一类方法就是上面所述的,利用堆里的内存来实现,但存在危险。strdup是从堆中分配空间的!strdup调用了malloc,所以它需要释放!对于堆栈:堆是由程序员来管理的,比如说new,malloc等等都是在堆上分配的!

栈是由编译器来管理的。

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

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

相关文章

eclipse中查看mysql_eclipse中怎样查看sqlite数据库的表

string createtable(classclazz , string tablename){//实例化一个容器&#xff0c;用来拼接sql语句stringbuffer sbuffer new stringbuffer();//sql语句&#xff0c;第一个字段为_id 主键自增&#xff0c;这是通用的&#xff0c;所以直接写死sbuffer.append("create tab…

Java 泛型(一)

1&#xff0c;泛型的声明 a&#xff09;在方法中的声明&#xff1a; 现在访问修饰符后&#xff0c;返回值类型前加上<T>&#xff0c;其它字母亦可。 b&#xff09;在类中的声明&#xff1a; 在类名后加<T> 练习&#xff1a;用泛型写一个方法&#xff0c;将一个数组…

敏捷开发之Scrum扫盲篇

现在敏捷开发是越来越火了&#xff0c;人人都在谈敏捷&#xff0c;人人都在学习Scrum和XP... 为了不落后他人&#xff0c;于是我也开始学习Scrum&#xff0c;今天主要是对我最近阅读的相关资料&#xff0c;根据自己的理解&#xff0c;用自己的话来讲述Scrum中的各个环节&#x…

macos xampp mysql 命令_MAC系统XAMPP 中 MySQL命令行client配置使用

在PHP的学习过程中。MySQL预计是必定会接触的。MySQL的管理相信大家也会使用phpmyadmin&#xff1a;好吧。phpmyadmin的确是MySQL管理的神器&#xff0c;你想要的。他好多都有&#xff0c;在开发的过程中。对于后台数据库的设计架构帮助真的非常大。可是。在这篇文章的主角确不…

]Kinect for Windows SDK开发入门(六):骨骼追踪基础 上

原文来自&#xff1a;http://www.cnblogs.com/yangecnu/archive/2012/04/06/KinectSDK_Skeleton_Tracking_Part1.html Kinect产生的景深数据作用有限&#xff0c;要利用Kinect创建真正意义上交互&#xff0c;有趣和难忘的应用&#xff0c;还需要除了深度数据之外的其他数据。这…

signal(SIGPIPE, SIG_IGN);

TCP是全双工的信道, 可以看作两条单工信道, TCP连接两端的两个端点各负责一条. 当对端调用close时, 虽然本意是关闭整个两条信道, 但本端只是收到FIN包. 按照TCP协议的语义, 表示对端只是关闭了其所负责的那一条单工信道, 仍然可以继续接收数据. 也就是说, 因为TCP协议的限制…

mysql与groupconcat相反的_MySQL中GROUP_CONCAT的反义词是什么?

我认为这是你需要的(存储过程)&#xff1a;Mysql split column string into rowsDELIMITER $$DROP PROCEDURE IF EXISTS explode_table $$CREATE PROCEDURE explode_table(bound VARCHAR(255))BEGINDECLARE id INT DEFAULT 0;DECLARE value TEXT;DECLARE occurance INT DEFAULT…

leetcode: Roman to Integer

http://oj.leetcode.com/problems/roman-to-integer/ Given a roman numeral, convert it to an integer.Input is guaranteed to be within the range from 1 to 3999. 思路&#xff1a; 根据个十百千位分别作为一个状态机处理就可以了。 1 class Solution {2 public:3 in…

mysql 线程池 下载_java线程池实现批量下载文件

本文实例为大家分享了java线程池实现批量下载文件的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下1 创建线程池package com.cheng.webb.thread;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.ExecutorService;import java.util.conc…

sqlite3 编译问题

sqlite3用到libpthread和libdl因此要链接这两个库 假如先把sqlite3.c编译成sqlite3.o或者libsqlite3.a g -lm -lpthread -ldl -o 目标 main.o sqlite3.o 或者 g -lm -lpthread -ldl -lsqlite3 -o 目标 main.o sqlite3.o 都会报链接错误&#xff0c;找不到pthread和dl里面的…

从零开始学习Hadoop--第2章 第一个MapReduce程序

1.Hadoop从头说 1.1 Google是一家做搜索的公司 做搜索是技术难度很高的活。首先要存储很多的数据&#xff0c;要把全球的大部分网页都抓下来&#xff0c;可想而知存储量有多大。然后&#xff0c;要能快速检索网页&#xff0c;用户输入几个关键词找资料&#xff0c;越快越好&…

mysql可以使用sqlplus么_使用sqlplus

1. 执行一个SQL脚本文件SQL>start file_nameSQL> file_name可以将多条sql语句保存在一个文本文件中&#xff0c;这样当要执行这个文件中的所有的sql语句时&#xff0c;用上面的任一命令即可.等于start命令&#xff0c;用来运行一个sql脚本文件命令调用当前目录下的&#…

CPU8085 8086名字的由来

为什么CPU叫8085呢&#xff1f; 8085这个名字的由来还是很有逻辑的&#xff1a;The naming of microprocessor indicates historical facts blended with technology improvements.1)The microprocessor came in the late 70s(1976).This was close to 80.so from here 1ST …

Daily Scrum 10.29

时间越来越紧迫&#xff0c;不过大家逐渐进入了状态。虽然在有些问题上大家意见有些不同&#xff0c;但是最终还都是为着团队着想&#xff0c;很好地达成一致了。 MemberToday’s Task Tomorrow’s Task李孟 task615 测试(活动) task571 完成daily scrum 10.29撰文 task615 测试…

python中list index out of range_Python知识精解:str split()方法

描述split()函数是Python字符串函数。split() 通过指定分隔符对字符串进行切片。如果指定了整型参数num&#xff0c;则仅分隔num 1个子字符串&#xff08;即分割num次&#xff09;。使用split()函数将字符串分割后&#xff0c;返回的是一个列表&#xff0c;列表中存储着分割后…

ashx连接mysql_对C#中的web访问mysql数据库的一些知识点进行了整理归纳总结

基本对比使用方式使用场合优缺点是否需要安装需要的dll网址引用方式程序内引用程序初期确定使用MySql&#xff0c;前期添加引用大多数情况下使用在类文件内&#xff0c;多数使用于aspx&#xff0c;ashx等带有后置代码的类文件中可以安装&#xff0c;也可以直接引用dll 多数情况…

mysql -b -e_MySQL 的B+树索引.

一、B树索引概述索引是应用程序设计和开发的一个重要方面。若索引太多&#xff0c;应用程序的性能可能会受到影响(需维护索引的结构和数据)&#xff1b;而索引太少&#xff0c;对查询性能又会产生影响。二叉树&#xff0c;左子树的键值总是小于根的键值&#xff0c;右子树的键值…

mysql 5.7 api 中文_mysql5.7怎么解决中文

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航&#xff0c;为用户…

mysql卸载完环境变量还有_MySql完全卸载

这篇文章为转载本博客内容均摘自其他博客&#xff0c;由我整合并且将内容更改的更为详细&#xff0c;方便自己以后观看&#xff0c;也方便各位同学学习&#xff0c;少踩一些坑1.首先我们看一下如何卸载(1)停掉MySql在Windows的服务&#xff1a;开始—> 运行—> services.…