C - Memcpy 两个 int 到单个 Void 指针

C - Memcpy two int's to a single Void pointer

我正在尝试将两个 int 复制到一个 void 指针中,并能够访问它们,但到目前为止没有成功。

void *buffer;
buffer = malloc (sizeof(int) + sizeof(int))
memcpy (&buffer, &int1, sizeof(int));
memcpy (&buffer + sizeof(int), &int2, sizeof(int));
printf ("%d", *(int*)buffer);

打印时,我得到的只是前4个字节的值。如有任何帮助,我们将不胜感激。

这里的主要问题是这部分

memcpy (&buffer, ...);
//      ^

首先,如果您想要 "array" 或 int 那么为什么不使用指向 int 的指针呢?您以后可以随时将其转换为通用的 void *。这将解决 一个 问题,这是您在第二个 memcpy 调用中尝试进行的指针运算。

回到我突出显示的部分,对 buffer 使用地址运算符是 错误的 并将传递指向 变量所在位置的指针 buffer 被存储,而不是 buffer 指向的地址。将地址运算符放在那里。

总结一下:

int *int_buffer = malloc(sizeof *int_buffer * 2);
memcpy(int_buffer, &int1, sizeof int1);     // or &int_buffer[0]
memcpy(int_buffer + 1, &int2, sizeof int2); // or &int_buffer[1]

void *buffer = int_buffer;

对于您的打印,您只需告诉 printf 打印第一个 int 元素。如果你想打印两个 int 元素,你需要告诉 printf 这样做。

您正在复制到指针的指针。

更改这两行:

memcpy (&buffer, &int1, sizeof(int));
memcpy (&buffer + sizeof(int), &int2, sizeof(int));

变成这样:

memcpy (buffer, &int1, sizeof(int));
memcpy (buffer + sizeof(int), &int2, sizeof(int));

更好的形式:

void* buffer = malloc(sizeof(int) * 2);
int* intbuffer = (int*)buffer;

memcpy(intbuffer, &int1, sizeof(int));
memcpy(intbuffer+1, &int2, sizeof(int));

你甚至可以完全避免 memcpy:

void* buffer = malloc(sizeof(int) * 2);
int* intbuffer = (int*)buffer;

intbuffer[0] = int1;
intbuffer[1] = int2;

对应的 printf("%d", *(int*)buffer); 适用于以上所有三个示例。