我正在尝试将两个整数复制到一个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个字节中的值。任何帮助将不胜感激,谢谢。
答案 0 :(得分:3)
您正在复制指针的指针。
更改这两行:
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);
适用于上述所有三个示例。
答案 1 :(得分:1)
这里的主要问题是这部分
memcpy (&buffer, ...);
// ^
首先,如果你想要一个“数组”或int
,为什么不使用指针int
?您可以随后将其转换为通用void *
。这将解决一个问题,这是您在第二次memcpy
调用中尝试执行的指针算法。
回到我突出显示的部分,使用buffer
的address-of运算符错误并传递指向变量 {{1存储,而不是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
这样做。