gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:40:48 24 4
gpt4 key购买 nike

我是一个相对较新的 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* 进行指针运算,而且我无法从我查看的资源中找出解决此问题的方法几个小时。

如有任何帮助,我们将不胜感激。

最佳答案

改用字符缓冲区。

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

关于c - 如何从 C 中的 void* 缓冲区存储和访问整数和 void*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23666094/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com