我正在开发一个系统(虚拟机?不知道如何调用它),其中每个数据结构都是一个数组(或结构),开头有三个整数字段(必须紧接着一个没有填充字节的开头)和n通用指针。我对此有很多想法,但似乎很难找到一个明确的解决方案。
下面是我的第一次尝试。
void **a = malloc(SOME_SIZE);
a[0] = (void *)1;
a[1] = (void *)0;
a[2] = (void *)1;
a[3] = malloc(SOME_SIZE); a[4] = malloc(SOME_SIZE); //and so on...
我不确定void *
对整数的强制转换是否安全。经过一番研究,我将代码更改如下。
void **a = malloc(SOME_SIZE);
*(uintptr_t *)a = 1;
*((uintptr_t *)a + 1) = 0;
*((uintptr_t *)a + 2) = 1;
a[3] = malloc(SOME_SIZE); a[4] = malloc(SOME_SIZE); //and so on...
但后来我发现在某些平台上sizeof(void *)
可能不相等sizeof(uintptr_t)
。所以我决定把它改成一个结构。
typedef struct data {
size_t counts[3]; //padding bytes are okay after this line
void *members[]; //flexible array member
} *data;
data a = malloc(sizeof(*a) + SOME_SIZE);
a->counts[0] = 1;
a->counts[1] = 0;
a->counts[2] = 1;
a->members[0] = malloc(SOME_SIZE); a->members[1] = malloc(SOME_SIZE); //and so on...
在这里,我发现了一个问题,即 C 中没有 100% 可移植的通用指针,但是我找不到解决方案,所以让我忽略一些具有不同指针大小的奇怪平台。
因此,鉴于 avoid *
可以存储指向任何对象的指针,我的最后一个解决方案是否满足我的目的?我对灵活的数组成员不太熟悉,所以我可能犯了一个错误。或者我可能仍然错过了一些要点。
任何帮助表示赞赏。