大家好,谢谢大家的帮助!
我正试图为多种数据类型(char, int, float,…)制作通用数据缓冲区,我想知道如何使用指针访问缓冲区和特定位置的特定地址。
让我举个例子来解释:
1)。假设我想保存4个变量(int, int, char, float)
2.),则该缓冲区的大小为:int size = sizeof(int)*2 + sizeof(char) + sizeof(float)
3.) so,缓冲区:void* buffer = malloc(size);
4)。现在,我已经分配了缓冲区,我想写一些浮点变量到特定的位置,也就是buffer + (sizeof(int)*2 + sizeof(char))对吧?如何做到这一点,如果它是可能的…
我有解决方案,我将写数据如何指定和它的工作,但我想跳上任何位置(当然,当我知道,确切的(地址)一些变量是在缓冲区)
所以像这样的东西对我有用:
int* val1 = (int*) buffer;
*val1 = 1;
buffer = val1+1; //move pointer behind first position (+ sizeof(int))
int* val2 = (int*) buffer;
*val2 = 2;
buffer = val2+1; //move pointer behind second position (+ sizeof(int))
char* val3 = (char*) buffer;
*val3 = 'a';
buffer = val+1; //move pointer behind third position (+ sizeof(char))
float* val4 = (float*) buffer;
*val4 = 11.4;
—>所有数据正确保存在缓冲区
但是我更有趣的是,如果有可能(以及如何)跳转并在第4个位置上写第一个float(不要忘记之前是int, int, char)
因为我不能使用:
float* val4 = (float*) buffer + 4; // value 4 has address buffer + sizeof(float)*4 and I need address buffer + sizeof(int)*2 + sizeof(char)
很抱歉解释得这么慢,但我想确定,我需要解决的问题真的很明显。非常感谢您的帮助!
p。s:我脑子里只有一个(char*)缓冲区的解决方案(因为在每个平台上都应该是sizeof(char) == 1 ....但我不确定,如果这真的是保存选项)
之后:
char* pointerOnVal4 = (char*) buffer + sizeof(int)*2 + sizeof(char);
float* val4 = (float*) pointerOnFloat;`
从您描述问题的方式来看,您希望:
struct Foo
{
int a, b;
char c;
float f;
};
但是如果你真的需要动态地执行它(我不确定你为什么要这样做),你可以这样写:
struct Type
{
size_t align;
size_t size;
};
struct Field
{
Type *type;
size_t offset;
};
class ObjectType
{
private:
std::vector<Field> fields;
public:
void add_field(Type *t)
{
size_t off = fields.empty() ? 0 : fields.back().offset + fields.back.type->size;
if (off % t->align)
off += t->align - off % t->align;
fields.push_back({t, off});
}
};
…然后在uint8_t
数组上使用ObjectType请注意,除了size必须是align的倍数之外,类型的大小和对齐之间没有一般的关系。例如,在某些系统上,long double具有对齐4和大小12(但只使用10个字节用于重要数据,2个字节用于填充)。
也就是说,如果你想让它在平台之间兼容(例如,跨网络,但也适用于同一主机上的32位和64位代码),你需要做的远远不止这些。
就像上面的答案一样,坚持使用struct:
typedef struct Foo{
int a;
int b;
char c;
float f;
}Foo;
Foo *bar = new(struct Foo);
bar->a = 1;
bar->b = 2;
bar->c = 'a';
bar->f = 11.4;
delete(bar);