我正在构建一个哈希库,这个库使用不同的struct
,所有这些struct
都有一个unsigned
类型作为第一个成员,一个例子:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct data {
unsigned hash;
void (*func)(struct data *);
};
struct another_data {unsigned hash; int value;};
static void *hash_insert(const char *text, size_t size)
{
unsigned *hash;
hash = malloc(size);
// *hash = hash(text);
*hash = (unsigned)strlen(text);
return hash;
}
static void func(struct data *data)
{
printf("%u\n", data->hash);
}
int main(void)
{
struct data *data;
data = hash_insert("Some text", sizeof *data);
data->func = func;
data->func(data);
free(data);
return 0;
}
由于struct
的第一个成员和struct
本身有相同的对齐要求,用指针调用malloc
是否有效第一个成员的类型,以便为整个 struct
保留空间?
unsigned *hash = malloc(size); /* where size is the size of the struct */
编辑:
在此related question由@MohitJain 提供:
struct Msg
{
unsigned int a;
unsigned int b;
};
...
uint32_t* buff = malloc(sizeof(Msg));
// Alias that buffer through message
Msg* msg = (Msg*)(buff);
The strict aliasing rule makes this setup illegal
但在我的例子中,我从函数返回一个 void *
,我可以在 main
中使用这个(返回的)指针而不会出现对齐问题,这个假设是否正确?
最佳答案
关于有效类型和指针别名的规则表明,可以在结构(或任何其他“聚合”)和与结构中第一个出现的成员相同类型的指针之间转换指针。另一条规则说结构不允许在最开始有填充。
所以就 C 标准而言,它很好......这并没有真正说明程序的质量。
这段代码没有多大意义。你明明想使用整个结构,那为什么不返回一个结构类型的指针呢?不要为了它而把事情复杂化。您应该始终避免在不需要时使用 void*
,以提高类型安全性。
总的来说,所有这些事情都会通过适当的程序设计在多文件项目中自行解决。如果您有一个包含哈希类型的单独文件和所有使用该类型的函数,那么毫无疑问如何编写程序。
关于c - 使用第一个成员类型的指针调用 malloc 是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37251387/