我想为缓冲区分配内存,该缓冲区将来通过memcpy包含一个包含先前已动态分配内存的指针的结构 .
也就是说,我有一个结构
struct test_struct {
int num;
char *values;
};
test_struct.values
包含 num
长度为 LENGTH
的字符串 . 我知道我无法获得指针已分配的内存大小,所以我只是通过 num
跟踪它 . 获取此结构大小的最简单/最简洁的方法是什么?
我能想到的唯一解决方案是
buf = malloc(sizeof(test_struct) + (num * LENGTH));
但我不熟悉这种低级内存管理的东西,所以可能会有更好的东西 .
3 回答
如果你想记忆两个结构,那么它们中的内存必须是连续的 . 但你必须事先确定
num
.我将char *更改为char **的原因是因为使用char *后第一次访问字符串变得更难(我假设它们是空终止的) . 此外,在调用memcpy之后,必须更新新结构中的所有字符串指针 .
要记住你会这样做:
但是在buf中,您只能看到第一个字符串(除非您的字符串不是以空值终止的) . 你必须在每个空终止字符后递增指针,直到你知道
num
,你已经到达缓冲区的末尾 .现在我了解了您的请求的更多内容,请考虑以下内容 .
如果您正在使用UDP数据包,则应将数据发送到一个数据包中,以便按预期顺序到达 . 当发送多个数据包时,它可能无序到达 . 因此,您需要确保数据的大小<= 512字节 - 这是UDP数据包的最大大小 . 此外,您需要确保所有数据都在连续的内存中 . 我在这个例子中提供了'm going to assume you have your data already in the struct you' ve:
您必须在接收端实现另一个将缓冲区映射到
struct test_struct
的函数 . 另外,为了清楚起见,我省略了错误检查 . 您应该在分配内存之前检查数据包的大小(它必须<= 512) . 您还应该检查以确保malloc返回一个非空指针 .你应该只需要分配4个字节(对于32位linux上的整数)和4个字节的char *(32位.64为8) .
你真正问的是,我怎么知道需要分配给char * value指向的区域需要多少内存 . 你在你正在做的事情中弄明白这一点 . 然后将值设置为buf的位置 . 如果你有多个字符串,那么有一个评论打击我,这是正确的方法,你不想只是将它们全部塞在那个区域,并且必须弄清楚哪个是你自己 .
我假设您要为结构和值指向的缓冲区分配内存 . 如果是这样,这是正确的 . 要指向额外的空间,请执行
buf->values = buf + 1;
(假设您将buf声明为struct test_struct buf;