我有以下以下列方式定义的结构
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);
}
那么这里到底有什么区别?
谢谢
答案 0 :(得分:2)
显然
sizeof(foo[0]) = sizeof(abcd)
自从您typedef
将abcd
作为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)
。