我需要在void buffer中添加以下数据:
MyStruct somedata; // some struct containing ints or floats etc.
string somestring;
我该怎么做?
这是我的缓冲区分配:
void *buffer = (void *)malloc(datasize);
如何首先将somedata
添加到缓冲区(可以说是20个字节),然后在20个字节后添加可变大小的字符串。我正在考虑逐字节读取结构并添加到缓冲区,但这感觉很愚蠢,必须有一些更简单的方法......?
编辑:我希望它等于:fwrite( struct1 ); fwrite( struct2 );这是顺序调用的,但我想写入void缓冲区而不是写入文件。
编辑2:让它正常工作,继承代码:
char *data = (char *)malloc(datasize);
unsigned int bufferoffset = 0;
for(...){
MyStruct somedata; // some POD struct containing ints or floats etc.
string somestring;
... stuff ...
// add to buffer:
memcpy(data+bufferoffset, &somedata, sizeof(MyStruct));
bufferoffset += sizeof(MyStruct);
memcpy(data+bufferoffset, somestring.c_str(), str_len);
bufferoffset += str_len;
}
有什么需要解决的吗?
答案 0 :(得分:2)
memcpy(buffer, &somedata, sizeof(MyStruct));
strcpy(buffer + sizeof(MyStruct), somestring.c_str());
将字符串复制为c字符串。
答案 1 :(得分:0)
在C中,我会这样做:
MyStruct somedata;
string somestring;
void *buffer = (void *)malloc(datasize);
memmove(buffer, &somedata, 20);
strcpy(buffer + 20, somestring);
但是在这个C代码的前3行中有很多的难闻气味:
MyStruct
或者是typedef(为什么?我讨厌typedef)或者它应该是struct MyStruct
string
是typedef(为什么?我讨厌typedef)或者它应该是struct string
;以“str”开头的标识符是保留的,程序员不应该使用malloc
的返回值是多余的,可能会隐藏错误在void *
char *buffer = malloc(datasize);
在C中,void*
和任何其他指针类型在两个方向上分配兼容,因此在将char *
传递给void *
时无需将memmove()
强制转换为memmove(buffer, &somedata, 20);
和朋友们。
{{1}}
答案 2 :(得分:0)
一般情况下,您应该避免对具有自定义复制构造函数的类执行此操作。
但如果您必须知道自己在做什么,请使用memcpy