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

时间:2014-05-14 22:16:12

标签: 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 store variables into buffer and access again?
    ...
}

基本上,我想要做的是将someFunction的参数存储到void *缓冲区中,稍后再次访问它。这包括存储sizeOfArg1,arg1,sizeOfArg2和arg2。

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

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

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

我已经在网上查看了各种来源,其中指出由于对齐问题而无法使用void *上的指针算法,而且我无法从我所看到的来源中弄清楚如何解决这个问题好几个小时。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

改为使用char缓冲区。

#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);
}