访问动态分配的 C 结构数组时出现段错误

Segfault while accessing dynamicly allocated C struct array

我有如下定义的结构

typedef struct _abcd {
    int a;
    unsigned long b;  
    void (*c)(int);
    int d;
} abcd_t, *abcd;

现在我有以下代码

static abcd foo

int set_size(int size){
   foo = malloc(sizeof(abcd) * size);
}

由于某种原因,此代码在访问数组成员的某些属性时出现段错误。 但我注意到,如果我将 malloc 行更改为以下 - 它可以解决问题

foo = malloc(sizeof(foo[0]) * size);

显然我觉得很奇怪 sizeof(foo[0]) = sizeof(abcd) 那么这里到底有什么区别呢?

谢谢

obviously sizeof(foo[0]) = sizeof(abcd)

这是不一样的,因为你 typedefabcd 设为指向 struct _abcd 的*指针*。

使用

foo = malloc(sizeof(*foo) * size);

即使 foo 的类型在某个时候发生变化,也能拥有健壮的代码。

你的

foo = malloc(sizeof(foo[0]) * size);

本质上是相同的,因为 foo[0] 只是 *(foo + 0) 的语法糖,变成 *foo.

错误是您正在分配 sizeof(abcd),那是一个指针,而不是结构。你想要 sizeof(abcd_t)sizeof(*abcd).