C 如何复制内存

C 如何复制内存,c,pointers,C,Pointers,假设我有: unsigned char *varA, *varB, *varC; varA=malloc(64); varB=malloc(32); varC=malloc(32); 如何将varA的第一个32字节放入varB,将最后一个32字节放入varC memcpy(varB, varA, 32); memcpy(varC, varA + 32, 32); 之所以如此简单,是因为底层数据类型是unsigned char,大小与字节相同。如果varA、varB和varC是整数,则需要将s

假设我有:

unsigned char *varA, *varB, *varC;
varA=malloc(64);
varB=malloc(32);
varC=malloc(32);
如何将varA的第一个32字节放入varB,将最后一个32字节放入varC

memcpy(varB, varA, 32);
memcpy(varC, varA + 32, 32);
之所以如此简单,是因为底层数据类型是
unsigned char
,大小与字节相同。如果
varA
varB
varC
是整数,则需要将size参数to
memcpy
(即32)乘以
sizeof(int)
,以计算要复制的正确字节数。如果我是学究,我可以在上面的例子中将32乘以
sizeof(unsigned char)
,但这不是必需的,因为
sizeof(unsigned char)
==1

请注意,我不需要将
varA+32
中的32乘以任何值,因为编译器在向指针添加常量偏移量时会为我这样做


还有一件事:如果您想加快速度,只需分别处理
varA
的每一半就足够了,而不是分配两个新缓冲区并复制到其中。

您可以使用循环逐个复制单个字节:

for(int i=0;i!=32;++i)
varB[i]=varA[i];
对于(int i=0;i!=32;++i)
varC[i]=varA[32+i];
或C运行时库中的
memcpy
函数:

memcpy(varB,varA,32);
memcpy(varC,varA+32,32);
好的,让我们开始

uint64 source;
uint32 upperBytes, lowerBytes;

upperBytes = source&0xFFFFFFFF00000000;
lowerBytes = source&0x00000000FFFFFFFF;

家庭作业完成。

你的问题与指针没有太大关系,你可能想重新思考“分开他们”意味着什么。我建议成立一个工会。。。我只是想澄清一下,我怀疑最终会是位而不是字节。我不明白你的答案。首先非常感谢你的答案,你已经非常清楚和详尽:)那么我如何处理“一半瓦拉”?假设我需要做
void*函数(int,半个变量),如何只传递“一半内存”?您可以选择
void*p=function(1234,varA)中的一个
void*p=函数(1234,varA+32)取决于您需要使用的
varA
的哪一半。当然,我使用1234来猜测
function()
的第一个参数。循环当然可以工作,但在这种情况下,我相信编译器和/或
memcpy
实现者。他们可以在底层程序集中完成编译循环无法触及的技巧(至少在没有优秀的优化器的情况下),比如一次移动多个字节。这只是一种不同的方法。通过循环进行复制可能包括一些处理,例如位洗牌。是的,如果需要处理,则需要循环。