【发布时间】:2010-11-04 00:20:19
【问题描述】:
我有一个函数,它的参数之一是“void* buffer”。在这个函数中,我需要写入那个内存位置。但是,做类似的事情
*buffer = "Hello\0Hi\0";
不起作用,因为我无法取消引用 void* 指针。如何将 a string 数据放入该内存位置?请注意,我需要复制数据,不一定是字符串,因为它可能包含空字符。
更新反映strcpy不够用
【问题讨论】:
我有一个函数,它的参数之一是“void* buffer”。在这个函数中,我需要写入那个内存位置。但是,做类似的事情
*buffer = "Hello\0Hi\0";
不起作用,因为我无法取消引用 void* 指针。如何将 a string 数据放入该内存位置?请注意,我需要复制数据,不一定是字符串,因为它可能包含空字符。
更新反映strcpy不够用
【问题讨论】:
如果你的字符串“可能包含空字符”,那么它就不是真正的 C 字符串。
如果您需要将一定数量的字节从一个内存位置复制到另一个内存位置,无论内容如何,您都可以使用memcpy。您可以使用sizeof 获取字符串文字的大小(此大小包括最终的隐式空终止符)。
【讨论】:
您不能使用赋值运算符来复制字符串。您需要使用 strcat 之类的东西(顺便说一下,它非常不安全)。
你可能正在寻找
strcpy( (char *) buffer, "Hello");
或者更好的是,使用 strncpy。您绝对需要传递缓冲区的大小并确保不会超出它,否则您的应用程序中就会存在巨大的安全漏洞,更不用说无数难以追踪的错误的来源了。
【讨论】:
void * 转换为另一种指针。这不是 C++。
strncpy 错误有两个原因:(a) 数据包含嵌入的 nuls,因此 mempcy 是合适的并且已经指定了长度。 (b) strncpy 并非设计为安全的字符串复制函数,它显示了,如果您的实现不提供一个和/或您正在编写可移植代码,您可以自己实现一个更好的。 (取消投票,一旦我注意到你在编辑嵌入 nuls 之前回答了。如果我只是因为认为strncpy 是一个合适的安全字符串复制功能而对人们投了反对票,我会达到每日上限......)