如何将常量unsigned char*负载转换为char*并复制它?

如何将常量unsigned char*负载转换为char*并复制它?,c,malloc,sizeof,memcpy,const-char,C,Malloc,Sizeof,Memcpy,Const Char,我正在尝试将一个const unsigned char*转换为char*,并制作一个副本。我尝试了下面代码的几种变体,但通常会出现内存异常。此函数驻留在用C编写的应用程序中 下面的函数是我试图创建的 //global variable char* copiedValue; void convertUnsignedChar(const unsigned char* message){ copiedValue = malloc(sizeof(message)); (void)me

我正在尝试将一个
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));

}

问题的很大一部分是
sizeof(message)
,它给出了指针的大小,而不是指针指向的对象

将长度传递给函数,或者(如果数据是以null结尾的字符串)用于获取长度(但不要忘记为终止符添加一个!),或者上述
strdup
函数(如果可用)。

malloc(sizeof(message))
仅为
char*
指针分配空间,可能是8字节。您需要为
消息
指向的数据分配空间

有一点问题:有多少数据是由
消息
指向的?它是空终止的吗?假设是这样,那么您可以使用
strlen
。不要忘记空字节的空间

copiedValue = malloc(strlen((char*)message) + 1);
类似于
memcpy

memcpy(copiedValue, message, strlen((char*)message) + 1);
注意,不需要将
memcpy
的返回值强制转换为
void


或者使用POSIX
strdup
功能

copiedValue = strdup((char *)message);

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