strdup函数的用法

2023-10-27

函数名: 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等等都是在堆上分配的!

栈是由编译器来管理的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

strdup函数的用法 的相关文章

  • 如何使用sprof?

    请举例说明 从邮件中找到here http sources redhat com ml libc alpha 2003 07 msg00029 html and here http sourceware org ml binutils 20
  • 如何使用 tmuxinator 在 tmux 中拆分水平窗格内的两个垂直窗格

    目前我的 tmuxinator yml 文件中有这个 windows editor layout main horizontal panes vim server rails s 这给了我两个窗口 一个用于编辑器 另一个用于服务器 在编辑器
  • 如何“grep”连续流?

    可以用吗grep在连续的流中 我的意思是有点tail f
  • bash双括号问题

    我对 bash 脚本非常陌生 在使用双括号时遇到了问题 我似乎无法让它们在 Ubuntu Server 11 10 中工作 我的下面的脚本位于 if test sh 中 bin bash if 14 14 then echo FOO fi
  • Bash 中 $() 和 () 之间的区别

    当我打字时ls l echo file 支架的输出 这只是简单的回显 被获取并传递到外部ls l命令 就等于简单的ls l file 当我打字时ls l echo file 我们有错误 因为不能嵌套 内部外部命令 有人可以帮助我理解之间的区
  • Alsa 带有来自调制解调器的 PCM 接口

    我有一个基于 imx28 CPU 的定制板 CPU 的串行端口连接到调制解调器的 PCM 输出 我必须为调制解调器的 PCM 接口开发一个驱动程序 使其成为 ALSA SoC 的一部分 您能指出内核树 中与我的设置重新组合的一些驱动程序吗
  • 为什么使用Python的os模块方法而不是直接执行shell命令?

    我试图了解使用Python的库函数执行特定于操作系统的任务 例如创建文件 目录 更改文件属性等 背后的动机是什么 而不是仅仅通过执行这些命令os system or subprocess call 例如 我为什么要使用os chmod而不是
  • 对 sf:: 的未定义引用

    我想用 C 制作 GUI 应用程序 发现 SFML 是一个不错的选择 幸运的是 我使用的是 Linux 所以 SFML 2 4 已经安装在我的系统上 所以我开始搜索一些教程并找到了一个制作简单窗口的教程 但是当我运行代码时 出现错误 提示未
  • 如何使用libaudit?

    我试图了解如何使用 libaudit 我想接收有关使用 C C 的用户操作的事件 我不明白如何设置规则 以及如何获取有关用户操作的信息 例如 我想获取用户创建目录时的信息 int audit fd audit open struct aud
  • 退出 bash 脚本但保持进程运行

    我正在运行服务器 需要使用参数执行以下命令 这些脚本目前工作得很好 但问题是当我运行脚本时我无法返回到控制台 它在控制台中保持运行 如果我强行停止它 那么该过程也会停止 我想继续运行该进程并返回到控制台 bin sh php home st
  • Docker DNS 设置

    我尝试使用自定义网络和 dos 设置创建 docker 容器 docker网络创建 driver bridge opt com docker network bridge enable ip masquerade true opt com
  • gnome-terminal 新选项卡,使用别名作为要执行的命令

    我已经创建了一个别名 bashrc文件如下 alias myproject cd Desktop myproject 当我重新启动终端时保存文件后 输入myproject带我到项目目录 但是当我尝试使用别名作为新的命令参数时gnome te
  • 如何在 Linux 中使用单行命令获取 Java 版本

    我想通过单个命令获取 Linux 中的 Java 版本 我是 awk 的新手 所以我正在尝试类似的事情 java version awk print 3 但这不会返回版本 我将如何获取1 6 0 21从下面的Java版本输出 java ve
  • Linux 文本文件操作

    我有一个格式的文件 a href a href a href a href 我需要选择 之后但 之前的文本 并将其打印在行尾 添加后 例如 a href http www wowhead com search Su a a a a a
  • 使用脚本自动输入 SSH 密码

    我需要创建一个自动向 OpenSSH 输入密码的脚本ssh client 假设我需要通过 SSH 进入myname somehost用密码a1234b 我已经尝试过 bin myssh sh ssh myname somehost a123
  • 是否有可能在linux中找到包含特定文本的文件?

    考虑这种情况 我在文件夹 Example 下有很多文件 如果我需要找到一个包含特定短语 如 Class Example 的文件 我该如何使用 Linux shell 来做到这一点 linux中有类似 定位 的函数可以做到这一点吗 Thank
  • 为什么 ld 无法从 /etc/ld.so.conf 中的路径找到库?

    我想添加 opt vertica lib64进入系统库路径 所以我执行以下步骤 1 添加 opt vertica lib64 into etc ld so conf 然后运行ldconfig 2 检查 bash ldconfig p gre
  • R 未获取用户库

    我有一个带 R 3 6 0 的 Fedora 30 系统 用户库设置在Renviron就像这个 R LIBS USER R LIBS USER R x86 64 redhat linux gnu library 3 6 事实上 它出现在交互
  • perf stat中的cycles注释是什么意思

    8 014196 task clock 0 004 CPUs utilized 204 context switches 0 025 M sec 32 cpu migrations 0 004 M sec 0 page faults 0 0
  • 是否从页面缓存中的脏页面进行文件读取?

    当字节写入文件时 内核不会立即将这些字节写入磁盘 而是将这些字节存储在页缓存中的脏页中 回写缓存 问题是 如果在脏页刷新到磁盘之前发出文件读取 则将从缓存中的脏页提供字节 还是首先将脏页刷新到磁盘 然后进行磁盘读取以提供字节 将它们存储在进

随机推荐

  • java8的常用的新特性

    Java 8引入了许多新的特性 下面列举了一些常用的新特性 Lambda表达式 Lambda表达式是Java 8中引入的一种函数式编程特性 提供了一种更简洁和灵活的方式来编写匿名函数 方法引用 方法引用允许直接引用已经存在的方法作为Lamb
  • 华为od机试面试题目

    1 华为机试102道题解 2 华为机考题目 2023年7月30日 19 30 22 00 机考提示 注意事项 考前必看 1 注意编译环境的变化及语言选择 选自己熟悉的语言机考 2 机考共3道题 150分钟完成 3 题目难度为 一星和两星 2
  • JS——Mediator(中介者)模式

    我们从日常的生活中打个简单的比方 我们去房屋中介租房 房屋中介人在租房者和房东出租者之间形成一条中介 租房者并不关心他租谁的房 房东出租者也不关心他租给谁 因为有中介的存在 这场交易才变得如此方便 在软件的开发过程中 势必会碰到这样一种情况
  • 自己定义控件

    http blog csdn net lmj623565791 article details 38173061
  • qt信号槽连接方式Qt::UniqueConnection的使用

    qt信号槽连接方式Qt UniqueConnection的使用 qt信号槽连接方式一共有以下五种 具体方式不在一一赘述 本文记录第五种Qt UniqueConnection的使用方法 Qt AutoConnection Qt DirectC
  • 机器学习的训练数据(Training Dataset)、测试数据(Testing Dataset)和验证数据(Validation Dataset)

    三者的意义 训练数据 用来训练模型的数据 验证数据 用来检验模型准确率 测试数据 再一次确认验证数据集中的模型是好的模型 一般步骤 测试数据集和验证数据的数据一定不能用来训练 否则会出现过拟合的现象 代码 import math impor
  • linux笔记(10):ubuntu环境下,基于SDL2运行lvgl+ffmpeg播放mp4

    文章目录 1 ubuntu安装ffmpeg 1 1 源码安装 1 1 克隆ffmpeg源码 1 2 配置编译条件 编译 安装 1 2 直接安装依赖包 2 下载lvgl源码 2 1 测试原始代码 2 2 运行lv example ffmpeg
  • Linux查看CPU和内存使用情况

    top命令 top命令是Linux下常用的性能分析工具 能够实时显示系统中各个进程的资源占用状况 类似于Windows的任务管理器 运行 top 命令后 CPU 使用状态会以全屏的方式显示 并且会处在对话的模式 用基于 top 的命令 可以
  • Unity UGUI Content 可以动态改变大小

    在UGUI中Scroll View是常用的一个东西 但是在加载内容的时候 有时候需要动态调整Content的大小 这时候就可以在Content上加上组件ContentSizeFitter这个组件 然后把可以选择的东西选择这个模式就可以了
  • C++中clock()函数的使用

    函数声明 clock t clock void clock t 是 long 型 typedef long clock t clock 使用的头文件是 time h CLOCK PER SEC表示每一秒经历的时钟数 通常我们用clock t
  • 告别枯燥乏味的编程学习,在欢声笑语中学会Python,华为大佬极力推荐Python漫画书!

    Python是学习大数据 人工智能时代的首选编程语言 Python因上手简单被越来越多的人所喜爱 每年使用人数在各类语言中稳居前二 而且每年是用人数还在直线上升 但是对于想要入门Python的同学仍一头雾水 虽然网上的资料很多 但是很多资料
  • 建站系列(七)--- 常用前后端框架

    目录 相关系列文章 前言 一 何为框架 二 为什么使用框架 三 常用框架 一 Bootstrap 二 Layui 三 JQuery 四 Vue js 四 ThinkPHP 五 Spring Boot 相关系列文章 建站系列 一 网站基本常识
  • 大家一起学电脑之硬件版

    大家一起学电脑之硬件版 首先文章还是先从硬件的认识开始 再到安装操作系统的注意事项 再到进入与退出系统可能发生的情况与问题 然后再说单个硬件的详解 最后再说故障和技巧吧 晕 因为有些文章因为发现的晚 所以排序有点儿乱了 0 38 02 11
  • 区块链开发

    区块链开发如今常见的语言有哪一些 区块链技术其实在如今的市场上已经得到大家的关注 这是大部分人可能并不了解 这到底是一种什么样的技术 为什么各大行业的巨头都会比较关注呢 如今的区块链开发已经进入到火热的阶段 那么你是否知道到底包含哪一种主要
  • Mybatis 是如何进行分页的?分页插件的原理是什么?

    1 Mybatis 使用 RowBounds 对象进行分页 也可以直接编写 sql 实现分页 也可以使用 Mybatis 的分页插件 2 分页插件的原理 实现 Mybatis 提供的接口 实现自定义插件 在插件的拦截方法内拦 截待执行的 s
  • git 如何解决 (master

    git 如何解决 master MERGING git reset hard head 回退版本信息 git pull origin master 转载于 https www cnblogs com 651434092qq p 110188
  • 国产开源新标杆!20B大模型,性能媲美Llama2-70B,单卡可推理

    明敏 发自 凹非寺量子位 公众号 QbitAI 国产新标杆 免费可商用的200亿参数大模型 来了 书生 浦语大模型 InternLM 20B版本正式发布 一举刷新国内新一代大模型开源纪录 它由上海人工智能实验室 上海AI实验室 与商汤科技联
  • MySQL入门---超详细安装及基本使用教程

    数据库技术和数据库系统 数据库技术和数据库系统已经成为计算机信息系统的核心技术和重要基础 gt gt MySQL简介 MySQL是一款单进程多线程 支持多用户 基于客户机 服务器 Client Server C S 的关系数据库管理系统 是
  • 怎么使用blender

    Blender是一款开源3D建模和动画软件 可以用来制作三维图像 动画 游戏 音频和视频 要使用Blender 需要先下载并安装该软件 安装完成后 打开Blender 您会看到一个3D空间 包含一个默认的立方体 可以通过鼠标和键盘来对立方体
  • strdup函数的用法

    函数名 strdup 功 能 将串拷贝到新建的位置处 用 法 char strdup char str 这个函数在linux的man手册里解释为 The strdup function returns a pointer toa new s