【发布时间】:2016-10-10 21:39:07
【问题描述】:
根据this StackOverflow 的评论,strncpy 永远不应与非固定长度数组一起使用。
strncpy除非您在结构/二进制文件中使用固定宽度、非必要终止的字符串字段,否则不应使用。 – R.. 2012 年 1 月 11 日 16:22
我知道如果您为字符串动态分配内存是多余的,但是否有理由使用strncpy 而不是strcpy 会不好
【问题讨论】:
-
您可以在这里找到答案 (stackoverflow.com/questions/1258550/…)
-
原因是它没有做你认为它做的事情。
-
你不应该将
strncpy用于任何目的,它本质上是不安全的,see this。相反,将strcpy与缓冲区大小检查一起使用。 -
@Lundin:结构具有需要容纳 4 或 8 个字符的固定长度字段的情况并不少见。任何坚持应用零终止的方法都将限制为 3 或 7 个字符,或者需要将字符串复制到外部缓冲区,然后使用 memcpy 来存储它。如果一个结构包含一个 char[8] 并且有必要将其初始化为“Hello”,我认为
strncpy(thing.name,"Hello",8);会比memcpy(thing.name, "Hello\0\0", 8);更干净,更不易碎 -
@supercat 初始化一个结构:
type_t type = { .str="Hello" };。运行时分配一个结构:type = (type) { .str="Hello" };。这与strncpy没有太大关系,它仍然是一个危险的、过时的函数,仅用于 Unix 中的古老字符串类型。