【ARM 嵌入式 C 字符串系列 23.5 -- 字符串复制函数 strdup 函数介绍】

文章目录

    • 字符串复制函数 strdup
      • 原型
      • 注意点
      • 示例
      • 测试代码
      • 总结

字符串复制函数 strdup

函数 strdup() 是一个在C标准库中并不直接包含,但在很多环境(如 POSIX 系统)中广泛可用的函数。该函数用于复制一个字符串,为新的字符串分配足够的内存空间,并返回新字符串的指针。如果内存分配失败,则返回 NULL

原型

strdup() 函数的原型通常如下所示:

char *strdup(const char *s);
  • 参数s 是指向需要被复制的原始字符串的指针。
  • 返回值:返回一个指向新分配空间的指针,该空间包含了一个与 s 相同的字符串副本。如果内存分配失败,则返回 NULL

注意点

  • strdup() 为新字符串分配的内存空间,应当在不再需要时使用 free() 函数释放,以避免内存泄漏。
  • 因为 strdup() 使用 malloc() 或类似函数来分配内存,所以必须检查返回值是否为 NULL,以处理内存分配失败的情况。

示例

下面的代码展示了如何使用 strdup() 来复制字符串,并在完成使用后释放分配的内存。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    const char *original = "Hello, World!";
    char *copy;
    // 使用strdup复制字符串
    copy = strdup(original);
    // 检查是否成功复制
    if(copy == NULL) {
        fprintf(stderr, "内存分配失败\n");
        return EXIT_FAILURE;
    }
    // 打印原始字符串和复制后的字符串
    printf("原始字符串: %s\n", original);
    printf("复制字符串: %s\n", copy);
    // 使用完毕后释放复制字符串的内存
    free(copy);
    return EXIT_SUCCESS;
}

测试代码

[08:21:40] (*^~^*) ~/zhugong/workbase/test$ gcc strdup.c -o strdup
[08:21:47] (*^~^*) ~/zhugong/workbase/test$ ./strdup
原始字符串: Hello, World!
复制字符串: Hello, World!

这个例子中,strdup() 用于创建原始字符串 "Hello, World!" 的一个副本。创建副本后,程序检查 strdup() 的返回值是否为 NULL,以确定内存分配是否成功。之后,打印出原始字符串和复制的字符串,最后使用 free() 函数释放 strdup() 分配的内存。

总结

strdup() 函数提供了一种便捷的方式来复制字符串,特别是当你需要对字符串进行修改而又不想更改原始字符串时。记住在使用完复制的字符串后,要释放相应的内存,以避免内存泄漏。尽管 strdup() 在某些环境中可能不可用,但它在许多平台上是支持的,是处理字符串时非常有用的工具。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Postman对@RequestPart和HttpServletRequest组合传参方式

使用Postman对RequestPart和HttpServletRequest组合传参方式 方法代码如下&#xff1a; /*** 发布*/ApiOperation("发布")ApiImplicitParams({ApiImplicitParam(name "req", value "json格式", dataType "Map", dataTypeClass Ma…

Docker-Compose概述与简单编排部署

目录 前言 一、Docker-Compose 概述 1、Docker-Compose 概念 2、Docker-Compose 优缺点 2.1 Docker-Compose 优点 2.2 Docker-Compose 缺点 3、Docker-Compose与Docker-Swarm的区别 二、两大文件格式 1、YAML 文件格式 2、JOSON 文件格式 3、YAML 与 JOSON 格式的区…

【C++】:const成员,取地址及const取地址操作符重载

目录 一&#xff0c;const成员二&#xff0c;取地址及const取地址操作符重载 一&#xff0c;const成员 将const修饰的“成员函数”称之为const成员函数&#xff0c;const修饰类成员函数&#xff0c;实际修饰该成员函数隐含的this指针&#xff0c;表明在该成员函数中不能对类的…

力扣刷题第0天:只出现一次的数字

目录 第一部分:题目描述 ​第二部分:题目分析 第三部分:解决方法 3.1思路1: 双指针暴力求解 3.2 思路2&#xff1a;异或运算 第四部分:总结收获 第一部分:题目描述 第二部分:题目分析 由图片分析可得&#xff0c;该题目对算法时间复杂度有一定的要求时间复杂度为O(N)&a…

Linux搭建mysql环境

搭建 MySQL 环境 1、使用 wget 下载安装包&#xff0c;下载到 opt 目录中 wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm2、安装 MySQL 公钥 rpm -i mysql57-community-release-el7-10.noarch.rpmrpm --import https://repo.mysql.com/RPM-GP…

【算法刷题 | 动态规划02】5.02(不同路径、不同路径||、整数拆分、不同的二叉搜索树)

文章目录 5.不同路径5.1题目5.2解法一&#xff1a;深度搜索5.2.1深度搜索思路5.2.2代码实现 5.3解法二&#xff1a;动规5.3.1动规思路5.3.2代码实现 6.不同路径||6.1题目6.2解法&#xff1a;动规6.2.1动规思路&#xff08;1&#xff09;dp数组以及下标含义&#xff08;2&#x…

python学习笔记B-18:序列结构之集合--集合的创建、操作与删除

集合的创建、常用操作和删除方法&#xff1a; s {1,2,3,4,5,} print(s)s set() #创建了一个空集合 print(s,type(s))s {} #创建了一个空字典 print(s, type(s))s set("helloworld") print(s) #集合内容是无序的&#xff0c;不重复&#xff0c;所以顺序混乱…

VG做mirror引起的块偏移

事件起因 Oracle10.2环境 Aix操作系统使用aix的lvm技术。制作vg的mirror。以此来替换掉老的存储。 做mirror前&#xff0c;数据库已完全关闭 故障现象 在启动数据库时&#xff0c;发现IO错误。该系统的spfile&#xff0c;ctl&#xff0c;dbf均是用lv做的裸设备。其中dbf是使…

STM32项目设计:基于stm32f1的智能门锁(附项目视频全套教程)

最近假期比较闲,拿着之前剩下的模块做了一个小玩具, 先制定一下此次玩具的规划,也可以理解为简易项目书。 开发软件&#xff1a;keil 硬件选型&#xff1a;STM32F103C8T6、RFID读卡器、oled屏幕、按键模块、蓝牙通信模块、蜂鸣器、舵机; 上位机&#xff1a; 1.上位机可以对密…

pkpmbs 建设工程质量监督系统 Ajax_operaFile.aspx 文件读取漏洞复现

0x01 产品简介 pkpmbs 建设工程质量监督系统是湖南建研信息技术股份有限公司一个与工程质量检测管理系统相结合的,B/S架构的检测信息监管系统。 0x02 漏洞概述 pkpmbs 建设工程质量监督系统 Ajax_operaFile.aspx接口处存在文件读取漏洞,未经身份认证的攻击者可以利用漏洞读…

【C++】拷贝复制:拷贝构造函数的使用

欢迎来到CILMY23的博客 本篇主题为&#xff1a;拷贝复制&#xff1a;拷贝构造函数的使用 博客主页&#xff1a;CILMY23-CSDN博客 个人专栏&#xff1a;Python | C | C语言 | 数据结构与算法 感谢观看&#xff0c;支持的可以给个一键三连&#xff0c;点赞关注收藏。 写在前头…

【趣味实践】KataGo+Sabaki搭建Ai围棋助手

前言 最近和同门在比试围棋&#xff0c;结果被爆虐&#xff0c;于是想借助Ai治治“嚣张”的他。 KataGo简介 继2016年AlphaGo出圈以来&#xff0c;已有不少Ai模型&#xff0c;其中部分如下图[1]所示。 在线围棋对弈网站OGS上&#xff0c;使用KataGo(https://online-go.com/)这…

什么是限流?常见的限流算法

目录 1. 什么是限流 2. 常见限流算法 3. 固定窗口算法 4. 滑动窗口算法 5. 漏桶算法 6. 令牌桶算法 7. 限流算法选择 1. 什么是限流 限流&#xff08;Rate Limiting&#xff09;是一种应用程序或系统资源管理的策略&#xff0c;用于控制对某个服务、接口或功能的访问速…

硬件知识积累 DP 接口简单介绍以及 DP信号飞线到显示屏的问题

1. DP 接口的介绍 定义与起源&#xff1a; DP接口是由PC及芯片制造商联盟开发&#xff0c;并由视频电子标准协会&#xff08;VESA&#xff09;标准化的数字式视频接口标准。它的设计初衷是为了取代传统的VGA、DVI和FPD-Link&#xff08;LVDS&#xff09;接口&#xff0c;以满足…

QT-QTCreator环境配置

准备工作&#xff1a; 下载QT: 链接&#xff1a;https://pan.baidu.com/s/1prJcsC4DGqhKiXvLuPQFVA?pwd60b3 提取码&#xff1a;60b3下载WindowsKits&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1QNiS3HpbH5M5kXx5AhkqnQ?pwde2h8 提取码&#xff1a;e2h8安装的…

Java数组深度剖析:掌握数据结构的基石

引言 在编程世界中&#xff0c;数仅仅是一种数据类型&#xff0c;它是理解内存分配、多维数据处理以及性能优组像是构建复杂数据结构的基本积木。它们简洁、高效&#xff0c;是管理元素集的首选方式。在Java中&#xff0c;数组不化的关键。 这篇文章致力于深入探讨Java数组的各…

android studio项目实战——备忘录(附源码)

成果展示&#xff1a; 1.前期准备 &#xff08;1&#xff09;在配置文件中添加权限及启动页面顺序 ①展开工程&#xff0c;打开app下方的AndroidManifest.xml,添加权限&#xff0c;如下&#xff1a; <uses-permission android:name"android.permission.CAMERA"…

【二】电力系统规约IEC 104详解

电力系统规约IEC 104详解 概述 很早就准备梳理出一下电力系统规约系列的文章&#xff0c;因为自己在实践过程中发现这方面太难找了&#xff0c;网上的资料也都比较陈旧。我接触和使用IEC系列规约也有一段时间了&#xff0c;本着总结和分享的想法&#xff0c;我想推出这系列的文…

在线的调试器pythontutor,支持C/C++

1. 背景介绍 对于C语言的学习最复杂的可能无疑就是指针的&#xff0c;指针因其灵活、晦涩难懂等特点而出名&#xff0c;本文并不介绍利用gdb的角度去分析它&#xff0c;而是通过一个在线网站而分析&#xff1b; 2.C代码调试 3. C代码调试 4在线网站 https://pythontutor.com/…

【项目纪实】某国有航空公司人力资源系统诊断咨询项目

公司的人力资源管理问题一直都比较严重&#xff0c;比如人员冗余、员工工作积极性差等问题&#xff0c;虽然经过多次的管理尝试&#xff0c;存在的问题仍然没有缓解。华恒智信人力资源咨询公司的老师特别专业&#xff0c;帮我们系统、全面的诊断了人力资源管理上存在的问题&…
最新文章