memcpy是否取决于源指针和目标指针的类型?

此代码

uint32_t length;
BYTE* message;
printf("Inspecting message with length %d and contents: ",length);
for(int i=0;i<length;i++)
    printf("%d ",message[i]);
printf("\n");
....
char* outbuff;
outbuff = (char*) malloc(sizeof(char) * length + sizeof(int));
uint32_t data_length = htonl(length);
memcpy(outbuff,&data_length,sizeof(int));
memcpy(outbuff + sizeof(uint32_t),message,length);

printf("Sending  outbuff over network with length %d and contents: ",outbuff[i]);
printf("\n");

不会如实地将数据从消息和长度复制到副本。但是,一旦我将outbuff的类型从char *更改为BYTE *,它就可以正常工作。

有人知道为什么会这样吗? documentation在这方面无济于事。

EDIT.1:将&length更改为&data_length。我手动键入代码,而不是在SX中复制。

EDIT.2:用于打印出BYTE数组的代码。

frazhao 回答:memcpy是否取决于源指针和目标指针的类型?

我要回答的是我自己编辑的新标题问题;-)。

答案是简单的否。

您问题中的链接显示memcpy()被声明为void *memcpy(void *dest,const void *src,size_t n);。这两个指针参数都是空指针。

标准草稿将任何指向void *的指针的转换列为标准转换(不需要显式强制转换)。 Specifically,it states(我强调):

  

其中“ T是对象类型”的“指向cv T的指针”类型的prvalue可以转换为“指向cv void的指针”的prvalue。 此转换未更改指针值([basic.compound])。

这意味着您扔给它的任何对象指针都将在memcpy看到它之前转换为数值相同的void指针,因此将被相同地对待。

您的问题必须在其他地方。

,

在这里只是猜测,但我认为您打算使用网络字节顺序,因此使用data_length属性,但是在此之后,您仍然将length放入缓冲区。

您的

memcpy(outbuff,&length,sizeof(int));

应该已经读过

memcpy(outbuff,&data_length,sizeof(uint32_t));

您似乎还可以交替使用intuint32_t。即使在大小匹配的平台上,一个也没有签名,而在没有签名的平台上却没有。

,

memcpy()BYTE*进行char*可能会导致char的范围回绕,即-127到127,因为BYTE从0到255。

例如,假设我们有:

BYTE uchArr[] = {12,129,250};
BYTE * ptr_uchArr = (BYTE*) malloc (sizeof(BYTE)*3);
memcpy(ptr_uchArr,&uchArr,sizeof(BYTE)*3);
//ptr_uchArr shall be {12,250} as intended...

现在我们要从memcpy()BYTE*执行char*

char * ptr_chArr = (char*) malloc (sizeof(char)*3);
memcpy(ptr_chArr,ptr_uchArr,sizeof(BYTE)*3);
//ptr_chArr shall be {12,-127,-6} as a result of wrap around...

如果我们执行从memcpy()char*的相反操作,即BYTE*

memcpy(ptr_uchArr,ptr_chArr,sizeof(BYTE)*3);
//ptr_uchArr shall still be {12,250} as intended again as a result of wrap around...
本文链接:https://www.f2er.com/3152358.html

大家都在问