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

时间:2018-11-15 00:50:04

标签: c malloc dynamic-arrays

我有以下以下列方式定义的结构

class (Show a, Eq a) => Bits a where
    zer :: a
    one :: a

main = print (zer :: Int)

现在我有以下代码

zer

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

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); } 那么这里到底有什么区别?

谢谢

2 个答案:

答案 0 :(得分:2)

  

显然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

答案 1 :(得分:0)

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