通过设置取消引用的指针将对象从堆栈复制到堆是一种好习惯吗?

问题描述 投票:0回答:1

请考虑此示例程序:

#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在什么情况下合适,而上述解决方案在什么情况下合适?

c stack heap
1个回答
0
投票

[将一个数组的内容复制到另一个数组时(这些内容不构成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 );

否则,请使用赋值运算符。

© www.soinside.com 2019 - 2024. All rights reserved.