首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在strncpy或类似的情况下使用memcpy是不好的做法吗?

在strncpy或类似的情况下使用memcpy是不好的做法吗?
EN

Stack Overflow用户
提问于 2016-07-07 21:02:25
回答 2查看 6K关注 0票数 1

在缓冲区之间移动字符串时,我经常将char*视为数据缓冲区,而不使用字符串缓冲区(strncpystrncat等)。示例:

代码语言:javascript
运行
复制
memcpy(target, src, strlen(src) + 1) // after buffer size checks
//vs
strncpy(target, src, target_size - 1);
target[target_size - 1] = 0;

这是个糟糕的做法吗?

编辑:我知道不同之处,这不是重复,而是一个标准实践的问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-07 21:08:25

如果您知道语义和大小,这不是一个问题。请记住,strncpy将在第一个null处停止,如果字符串较短(如果源中没有空字节,它将不会写入空字节)。strncpy还可以为您提供一些更好的排版功能,因为它期望在所有情况下都使用char *,而不是void *

更有效的方法值得商榷,但是基于CPU批量指令(可以在一条指令中复制整个内存块),memcpy可能更快,因为strncpy会检查每个复制的字节是否有一个NUL字符。

票数 2
EN

Stack Overflow用户

发布于 2016-07-07 21:07:36

使用

代码语言:javascript
运行
复制
memcpy(target, src, strlen(src) + 1) // after buffer size checks

可能涉及遍历字符串两次--一次在strlen中,一次在memcpy中。如果使用strcpy,就会受到一些小的性能影响。

如果出于不相关的原因计算字符串的长度,或者使用来自其他资源的字符串长度,我不清楚memcpystrncpy更好还是更差。

如果由于其他原因没有计算字符串的长度,或者没有来自其他资源的字符串长度,最好使用strcpy而不是memcpystrncpy

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38255212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档