【发布时间】:2020-07-13 13:55:51
【问题描述】:
请考虑这个示例程序:
#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 在什么情况下合适,而上述解决方案在什么情况下合适?
【问题讨论】:
-
这是一个有效的代码。您可以将结构的一个对象分配给正常结构的另一个对象。 memcpy 用于例如没有结构对象或您需要进行“深度”复制时。
-
assignment和
memcpy之间的选择只是个人风格,没有什么重要的原因。 -
但是如果是数组而不是单个对象,则需要使用
memcpy,因为不能分配数组。 -
@VladfromMoscow
memcpy()不做深拷贝。它只是复制顶级对象的字节。 -
@VladfromMoscow 赋值和 memcpy 都会以同样的方式复制指针。
memcpy()不会递归。
标签: c stack heap-memory