【问题标题】:How to convert const unsigned char* payLoad to char* and copy it?如何将 const unsigned char* payLoad 转换为 char* 并复制它?
【发布时间】:2019-01-08 12:16:21
【问题描述】:

我正在尝试将 const unsigned char* 转换为 char* 并进行复制。我尝试了以下代码的几种变体,但通常会出现内存异常。此函数驻留在用 C 编写的应用程序中。

下面的函数是我想要创建的

//global variable
char* copiedValue;

void convertUnsignedChar(const unsigned char* message){

    copiedValue = malloc(sizeof(message));
    (void)memcpy(copiedValue, message, sizeof(message));

}

【问题讨论】:

  • 为什么需要“转换”数据?你需要修改它吗?虽然不在标准 C 中(但在其他标准中),但您可能有一个 strdup 函数,它可能会执行您想要的操作(如果内容是字符串)。哦,别忘了在某个时候free 数据,否则你会发生内存泄漏。
  • 为什么需要转换指针?如果您必须删除const 限定符,那么您的系统设计很可能已损坏,因为它不是const-正确的。

标签: c malloc sizeof memcpy const-char


【解决方案1】:

你的问题很大一部分是sizeof(message),它给你指针的大小,而不是它指向的大小。

要么将长度传递给函数,要么(如果数据是以空字符结尾的字符串)使用strlen 来获取长度(但不要忘记为终止符添加一个!)或者上面提到的@ 987654324@ 函数(如果可用)。

【讨论】:

    【解决方案2】:

    malloc(sizeof(message)) 只为char * 指针分配空间,大概8 个字节。您需要为message 指向的数据分配空间。

    有一个问题:message 指向了多少数据?它是否为空终止?假设它是,那么您可以使用strlen。不要忘记空字节的空间!

    copiedValue = malloc(strlen((char*)message) + 1);
    

    memcpy 也是如此。

    memcpy(copiedValue, message, strlen((char*)message) + 1);
    

    注意,不需要将memcpy 的返回值转换为void


    或者使用 POSIX strdup 函数。

    copiedValue = strdup((char *)message);
    

    【讨论】:

    • @M.M 谢谢,已解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多