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);
适用于以上所有三个示例。
我正在尝试将两个 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);
适用于以上所有三个示例。