访问动态分配的 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)
这是不一样的,因为你 typedef
将 abcd
设为指向 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)
.
我有如下定义的结构
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)
这是不一样的,因为你 typedef
将 abcd
设为指向 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)
.