【问题标题】:writing to a given void* memory location in C写入 C 中给定的 void* 内存位置
【发布时间】:2010-11-04 00:20:19
【问题描述】:

我有一个函数,它的参数之一是“void* buffer”。在这个函数中,我需要写入那个内存位置。但是,做类似的事情

*buffer = "Hello\0Hi\0";

不起作用,因为我无法取消引用 void* 指针。如何将 a string 数据放入该内存位置?请注意,我需要复制数据,不一定是字符串,因为它可能包含空字符。

更新反映strcpy不够用

【问题讨论】:

    标签: c pointers


    【解决方案1】:

    如果你的字符串“可能包含空字符”,那么它就不是真正的 C 字符串。

    如果您需要将一定数量的字节从一个内存位置复制到另一个内存位置,无论内容如何,​​您都可以使用memcpy。您可以使用sizeof 获取字符串文字的大小(此大小包括最终的隐式空终止符)。

    【讨论】:

    • 我会小心建议使用 sizeof 来确定字符串的大小。是的,'sizeof("Hello")' 会给你正确的答案。但是 'char* p = "Hello"; .. sizeof(p); ' 不会。
    • @user434507:虽然这是真的,但这是 OP 获取“字符串”大小的唯一方法,除非他定义了其他方法来识别“字符串”的结尾。
    • 我从来没有说过它是一个字符串,只是数据。感谢 memcpy 的提示 :)
    【解决方案2】:

    您不能使用赋值运算符来复制字符串。您需要使用 strcat 之类的东西(顺便说一下,它非常不安全)。

    你可能正在寻找

    strcpy( (char *) buffer, "Hello");
    

    或者更好的是,使用 strncpy。您绝对需要传递缓冲区的大小并确保不会超出它,否则您的应用程序中就会存在巨大的安全漏洞,更不用说无数难以追踪的错误的来源了。

    【讨论】:

    • 您不需要将void * 转换为另一种指针。这不是 C++。
    • strncpy 错误有两个原因:(a) 数据包含嵌入的 nuls,因此 mempcy 是合适的并且已经指定了长度。 (b) strncpy 并非设计为安全的字符串复制函数,它显示了,如果您的实现不提供一个和/或您正在编写可移植代码,您可以自己实现一个更好的。 (取消投票,一旦我注意到你在编辑嵌入 nuls 之前回答了。如果我只是因为认为strncpy 是一个合适的安全字符串复制功能而对人们投了反对票,我会达到每日上限......)
    • 史蒂夫,感谢您删除了反对票,我很感激。我不一定会说 strncpy 是一个安全的选择,但我想明确指出 strcpy 绝对不是要走的路,需要进行一些适当的边界检查。写“strncpy”比大喊大叫要快。另外-如果您知道长度(即如果它是字符串文字),那么您是对的 memcpy 是正确的,但是我更多地考虑的是一般的字符串分配,即假设函数获取 const char * 而不是已知字符串长度。
    猜你喜欢
    • 1970-01-01
    • 2022-12-29
    • 2023-03-03
    • 1970-01-01
    • 2015-05-25
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    相关资源
    最近更新 更多