c - 使用第一个成员类型的指针调用 malloc 是否有效?

标签 c struct

我正在构建一个哈希库,这个库使用不同的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/

相关文章:

c - C 中全局结构变量的最佳使用

c - 测试信号量如何工作

c - 在这种情况下要求 `malloc()`

c - C 中的段错误

c - 通过 USB 获取系统日期/时间

c++ - 如何识别这个结构体中mYear元素的含义?

c - 两段看似相同的代码却有不同的结果(将指针传递给结构)

c - 它是 C 语言中的通用堆栈数据结构链表实现吗?

c - 为什么 C 在 -> 和 . 之间有区别?

c - 使用 strcmp 使用指向结构的指针数组对数据进行排序