【发布时间】:2013-02-23 21:31:09
【问题描述】:
我正在做一些关于 Olimex LPC2378-STK 的工作。
我有以下声明。
unsigned char buffer[256];
然后我尝试这样做:
strncpy((char *)buffer, "CREATED_BY", 255);
有谁知道为什么这会导致问题。
如果我注释掉它运行没有问题但使用它似乎会导致程序死亡的代码行。
有人有什么想法吗?
【问题讨论】:
-
在这里使用
strncpy没有意义。您可能会避免潜在的缓冲区溢出,但是如果缓冲区不够大,您最终会遇到不同的问题。不过,看起来这不是问题的原因。 -
我看不出这有什么问题,除了它毫无意义。如果您要使用
strncpy(),您需要记住它总是写入 N 个字符,其中 N 是最后一个参数。。如果源字符串长度(包括空终止符)小于 N,则它将用 0 将剩余空间回填到 N。如果它更长,它将最多复制 N 个字符,并且不会将最后一个字符设置为 0。但它总是以一种或另一种方式写入 N 个字符。我认为您可能在某个地方遇到了另一个问题,该问题超出了 this 缓冲区,并且可能 0-clear 暴露了该问题。 -
谢谢大家,我一直在摸索。关于其他事情的观点很好。鉴于电路板和堆栈空间的限制,这可能是问题所在。有趣的调试时间。
-
尽量减少缓冲区大小
-
@Clifford 真的吗?因为根据标准,C9899 §7.23.2.4,p3 "如果s2指向的数组是一个短于n个字符的字符串,则在副本中追加空字符s1 指向的数组,直到 n 个字符全部被写入。”。我曾经使用过的每个声称符合标准的库都会这样做,所以我不确定您正在使用什么库。