如何将不同的数据类型推送到void缓冲区?

时间:2010-11-13 15:51:48

标签: c++ c visual-studio-2008

我需要在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;
}

有什么需要解决的吗?

3 个答案:

答案 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