请考虑此示例程序:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int a;
int b;
} X;
int main(void) {
X* p = malloc(sizeof(X)); // Heap allocation
X z = {.a = 2, .b = 3}; // Stack allocation
*p = z; // Copying from the stack onto the heap
printf("\n%d\n", p->b);
return 0;
}
此程序正确打印3
。我认为这意味着*p = z
已成功将z
的数据从堆栈复制到堆中。
如果可以很容易地将内容从堆栈复制到堆,为什么大多数人在尝试执行此操作时会使用memcpy
? (E.g. this SO question)。
memcpy
在什么情况下合适,而上述解决方案在什么情况下合适?
[将一个数组的内容复制到另一个数组时(这些内容不构成string),或者尝试映射一个对象的内容时,将使用memcpy
键入其他类型的对象的字节。
例如,如果您将struct
类型映射到unsigned char
数组,则将执行以下操作:
X foo = {1, 2};
unsigned char bytes[ sizeof foo ];
memcpy( bytes, &foo, sizeof foo );
类似地,如果您试图将一个数组的内容复制到另一个数组,并且这些内容不构成string,则您还可以使用memcpy:
int src[N];
int dst[N];
...
memcpy( dst, src, sizeof dst );
否则,请使用赋值运算符。