网易首页 > 网易号 > 正文 申请入驻

C语言中自定义strncpy函数及内存重叠问题的处理

0
分享至

在C语言中,strncpy是一个常用的字符串处理函数,用于将源字符串的n个字符复制到目标字符串中。然而,标准库中的strncpy并不处理源字符串和目标字符串内存重叠的情况。如果源字符串和目标字符串的内存区域有重叠,直接使用strncpy可能会导致数据被意外覆盖,从而产生未定义行为。

本文将详细讲解如何用C语言实现一个考虑内存重叠情况的strncpy函数,并在必要时通过代码和注释进行说明。



一、strncpy函数的基本实现

首先,我们来看一下不考虑内存重叠情况下strncpy的基本实现。这个函数接受三个参数:目标字符串的指针dest,源字符串的指针src,以及要复制的字符数n。

#include   // 为了使用NULLchar* my_strncpy(char* dest, const char* src, size_t n) {    char* dest_start = dest;    // 复制n个字符或直到遇到src的结尾    while (n-- && *src != '\\0') {        *dest++ = *src++;    }    // 如果n还大于0,用'\\0'填充剩余的空间    while (n--) {        *dest++ = '\\0';    }    return dest_start;}
二、处理内存重叠的情况

当src和dest指向的内存区域有重叠时,直接的字符复制可能会导致数据被提前覆盖,从而引发错误。为了解决这个问题,我们可以采用两种方法:

  1. 使用临时缓冲区:这种方法比较简单,但需要额外的内存空间。
  2. 使用memmove算法:这是更高效的方法,不需要额外的内存空间,但需要更复杂的逻辑来处理重叠区域。

由于使用临时缓冲区的方法相对简单且不是本文的重点,我们将专注于实现类似memmove的处理逻辑。

三、实现类似memmove的strncpy

为了实现一个能够处理内存重叠的strncpy,我们可以借鉴memmove函数的实现思路。memmove通常通过判断源地址和目标地址的相对位置,来决定是从前往后复制还是从后往前复制,从而避免覆盖未复制的数据。

以下是考虑内存重叠的strncpy实现:

#include   // 为了使用NULL和size_tchar* safe_strncpy(char* dest, const char* src, size_t n) {    char* dest_start = dest;    if (dest < src || (dest >= src + n)) {        // 正向复制(无重叠或dest在src之后)        while (n-- && *src != '\\0') {            *dest++ = *src++;        }        // 填充剩余的n个字符为'\\0'        while (n--) {            *dest++ = '\\0';        }    } else {        // 反向复制(dest在src之前且有重叠)        src += n - 1;  // 移动到src的末尾        dest += n - 1; // 移动到dest的末尾        while (n--) {            if (*src != '\\0') {                *dest-- = *src;            }            src--;            if (dest < src) { // 当dest指针小于src时,说明已无重叠部分,可以提前结束                break;            }        }        // 从后往前填充'\\0'直到达到原始dest位置        dest++; // 因为上面循环结束时dest多减了一次        while (dest < dest_start + n) {            *dest++ = '\\0';        }    }    return dest_start;}
四、总结

实现一个安全的strncpy函数,特别是在处理内存重叠的情况时,需要谨慎处理指针和循环的逻辑。上述safe_strncpy函数通过判断内存区域是否重叠,并采取相应的复制策略,来确保数据的正确复制。在实际应用中,如果遇到需要复制重叠内存区域的情况,应该使用类似上述的安全函数,以避免未定义行为和数据损坏。

#头条创作挑战赛#​

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
特斯拉三款新车曝光!确认年内推出/最快8月亮相

特斯拉三款新车曝光!确认年内推出/最快8月亮相

爱卡汽车
2024-06-17 09:10:03
牵出大瓜!李双江被取消“天价养老金”,背后的原因是什么?

牵出大瓜!李双江被取消“天价养老金”,背后的原因是什么?

聚合大娱
2023-10-13 17:18:31
马筱梅再叫板大s,晒汪小菲跟孩子过父亲节,网友:还得筱梅治大s

马筱梅再叫板大s,晒汪小菲跟孩子过父亲节,网友:还得筱梅治大s

花花lo先森
2024-06-17 15:39:24
揭秘秦岚与魏大勋被曝分手真实内幕

揭秘秦岚与魏大勋被曝分手真实内幕

代军哥哥谈娱乐
2024-06-17 09:32:11
普京:如果乌克兰放弃加入北约,俄罗斯将立即停火

普京:如果乌克兰放弃加入北约,俄罗斯将立即停火

花非花008
2024-06-14 21:54:14
俄乌战争进行到现在,胜负已现端倪

俄乌战争进行到现在,胜负已现端倪

清哲木.看见
2024-04-24 19:00:59
小事开大会,大事开小会

小事开大会,大事开小会

煮酒杂谈
2024-06-18 00:03:31
重大反转,特朗普“反悔”了

重大反转,特朗普“反悔”了

商业周刊中文版
2024-06-17 14:16:23
法国翻脸不认人?推动欧盟制裁中国,白兰地酒厂商:已担心遭报复

法国翻脸不认人?推动欧盟制裁中国,白兰地酒厂商:已担心遭报复

娱乐圈的大爆炸
2024-06-17 18:06:00
回应韦世豪?伊万宣布国足点球手 队长最佳人选不是王大雷

回应韦世豪?伊万宣布国足点球手 队长最佳人选不是王大雷

球事百科吖
2024-06-17 11:22:42
闹大了!张海波爆料樊小慧曾是坐台小姐,惊人聊天记录曝光!

闹大了!张海波爆料樊小慧曾是坐台小姐,惊人聊天记录曝光!

小毅讲历史
2024-06-16 19:51:07
欧冠冠军日落西山,账面仅剩8000欧,负债1亿欧,无缘下赛季欧冠

欧冠冠军日落西山,账面仅剩8000欧,负债1亿欧,无缘下赛季欧冠

邮轮摄影师阿嗵
2024-06-17 18:53:03
皮尔斯:贝林厄姆在球场有一种绝佳的傲慢,而且勇敢无畏

皮尔斯:贝林厄姆在球场有一种绝佳的傲慢,而且勇敢无畏

懂球帝
2024-06-17 15:04:19
男子酒后误开邻居家门,与女主人发生关系,居然得逞……

男子酒后误开邻居家门,与女主人发生关系,居然得逞……

极品小牛肉
2024-03-01 22:37:49
足协杯限制出场球员:费南多、周定洋无缘,德尔加多可上阵

足协杯限制出场球员:费南多、周定洋无缘,德尔加多可上阵

懂球帝
2024-06-17 21:50:06
看了65岁向太的打扮,才发现:首饰不戴金,穿衣不扮嫩,更优雅

看了65岁向太的打扮,才发现:首饰不戴金,穿衣不扮嫩,更优雅

白宸侃片
2024-06-14 23:55:06
学霸47刀捅死女友后,当街扒光内裤猛舔私处:“我用生命在爱你”

学霸47刀捅死女友后,当街扒光内裤猛舔私处:“我用生命在爱你”

揉碎夏的诗
2024-01-11 13:15:34
北京一军官娶海军美女少校为妻,2年后才发现妻子的真实身份

北京一军官娶海军美女少校为妻,2年后才发现妻子的真实身份

星辰故事屋
2024-06-05 12:16:48
大师王林忽悠女明星阴阳双修,用联通之法,让女星吸收他的法力

大师王林忽悠女明星阴阳双修,用联通之法,让女星吸收他的法力

吴学华看天下
2023-12-09 19:43:32
上海这夜,耍大牌周也和勒肉张碧晨,都败给了“全裹”出镜的高叶

上海这夜,耍大牌周也和勒肉张碧晨,都败给了“全裹”出镜的高叶

一娱三分地
2024-06-16 08:55:03
2024-06-18 01:26:44
鲨鱼编程
鲨鱼编程
懂点技术,懂点编程
441文章数 155关注度
往期回顾 全部

科技要闻

为什么你的iPhone,肯定用不上"苹果AI"?

头条要闻

瑞典智库称中国核弹头数量增加总数达500枚 中方回应

头条要闻

瑞典智库称中国核弹头数量增加总数达500枚 中方回应

体育要闻

飞翔的斗牛士 如今也迎来最后一舞

娱乐要闻

上影节红毯:倪妮好松弛,娜扎吸睛

财经要闻

人均养老金上调3% 怎么年轻人吵翻了?

汽车要闻

传奇新篇章 全新一代大众迈腾来了

态度原创

家居
时尚
手机
亲子
游戏

家居要闻

研己实景 古典与现代的交融

永不过时的高级感,这个风格已经美了20年了

手机要闻

Omdia:2024 上半年中国可折叠 OLED 面板出货量将首超韩国三星

亲子要闻

弟弟用力掐姐姐的脸,姐姐一声不吭看了一眼妈妈,站起来一顿操作

《寂静之地:前方之路》年内发售 登陆主机和PC

无障碍浏览 进入关怀版