c++访问void*中的特定地址



大家好,谢谢大家的帮助!

我正试图为多种数据类型(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);

最新更新