如何从C中的void*缓冲区存储和访问整数和void*?

如何从C中的void*缓冲区存储和访问整数和void*?,c,pointers,void,C,Pointers,Void,我是一个相对较新的C程序员,我有以下问题: void someFunction(int sizeOfArg1, void* arg1, int sizeOfArg2, void* arg2) { // Buffer to store sizeOfArg1, arg1, sizeOfArg2, arg2 void* buffer = malloc(sizeof(int) + sizeof(int) + sizeOfArg1 + sizeOfArg2); // How to

我是一个相对较新的C程序员,我有以下问题:

void someFunction(int sizeOfArg1, void* arg1, int sizeOfArg2, void* arg2)
{
    // Buffer to store sizeOfArg1, arg1, sizeOfArg2, arg2
    void* buffer = malloc(sizeof(int) + sizeof(int) + sizeOfArg1 + sizeOfArg2);

    // How to store variables into buffer and access again?
    ...
}
基本上,我想做的是将someFunction的参数存储到void*缓冲区中,稍后再访问它。这包括存储sizeOfArg1、arg1、sizeOfArg2和arg2

这里,sizeOfArg1是arg1的字节大小,sizeOfArg2是arg2的字节大小。arg1和arg2是void*指针

对于单变量,我知道可以使用memcpy()或strlen()(如果参数是字符串)。另外,如果所有参数都是单一定义的类型,我知道可以使用指针算法来存储变量。但是,我想做的是以后存储和检索这些值

我之所以试图解决这个问题,是因为我需要将缓冲区传递到sendto()函数中,以便通过UDP将一些信息从客户端发送到服务器。函数的作用是:接受void*buf参数

我在网上查阅了各种资料,其中指出,由于对齐问题,void*上的指针算法是不可取的,我已经查阅了好几个小时的资料,还没有找到解决这个问题的方法


任何帮助都将不胜感激。

请使用字符缓冲区

#include <stdint.h>  // uint32_t

void func(uint32_t size1, void *arg1, uint32_t size2, void *arg2) {

  uint32_t nsize1 = htonl(size1), nsize2 = htonl(size2);
  uint32_t size = sizeof(size1) + sizeof(size2) + size1 + size2;
  char *buf = malloc(size);

  memcpy(buf,                         &nsize1, sizeof(nsize1));
  memcpy(buf + sizeof(size1),         arg1,    size1);
  memcpy(buf + sizeof(size1) + size1, &nsize2, sizeof(nsize2));
  memcpy(buf + size - size2,          arg2,    size2);

  // sock and dest_addr need to come from somewhere
  sendto(sock, buf, size, 0, dest_addr, sizeof(dest_addr));

  free(buf);
}
#包括//uint32\t
无效函数(uint32大小1,无效*arg1,uint32大小2,无效*arg2){
uint32_t nsize1=htonl(尺寸1),nsize2=htonl(尺寸2);
uint32_t size=sizeof(size1)+sizeof(size2)+size1+size2;
char*buf=malloc(大小);
memcpy(buf和nsize1,sizeof(nsize1));
memcpy(buf+sizeof(size1)、arg1、size1);
memcpy(buf+sizeof(size1)+size1和nsize2,sizeof(nsize2));
memcpy(buf+尺寸-尺寸2,arg2,尺寸2);
//sock和dest_addr需要来自某个地方
发送到(短袜,基本单位,大小,0,目的地址,大小(目的地址));
免费(buf);
}

< /Cord>为什么不声明一个结构类型来保存这些信息?如果要串行化该结构(如通过网络发送),请考虑使用固定宽度类型,如“代码> UTI32×T T < /COD>。否则,考虑<代码> SIZEXT ,该类型是针对对象大小的。将指针算术转换为
char*
。(
sizeof(char)
始终为1)@Deduplicator:谢谢您的帮助。我不知道sizeof(char)=1字节总是正确的。我们能够解决上述问题。下面ooga的解决方案基本上就是使用这个想法,所以我接受了它作为答案。如果你希望另一端能够可靠地读取你的INT,你应该在它们上面使用
htonl
(并且让另一端使用
ntohl
);或者其他格式,只要两端以相同的方式解包。不同的系统可能使用不同的内存布局来存储变量。