在C中初始化结构 - 避免分段错误

时间:2012-03-09 18:15:54

标签: c pointers struct initialization

我是C的新手,对初始化结构有疑问。我使用的是一种我没有创建的结构,所以我不知道它里面是什么。因此,我没有初始化它,但编译器抱怨。所以我把它设置为NULL但是我遇到了分段错误。然后我查找了如何将所有内容设置为0并且它说将其设置为等于{0}。这也给了我一个分段错误。因为我知道我调用的函数是正确的,并且我传递的数组的大小正确,我几乎可以肯定它与我初始化结构的方式有关。初始化是

struct aes_ctx *aes_struct = {0}

该功能的标题是

void aes_setkey(aes_ctx *aes, const void *key, u_int len);

我称之为

的方式
aes_setkey(aes_struct, aes, CCA_STRENGTH);

其中aes是大小为16的缓冲区,CCA_STRENGTH是16的常量int。

总结一下这个问题,我认为我初始化结构的方式导致它在以后无法使用。任何可以给我的帮助将非常感激! 谢谢!

4 个答案:

答案 0 :(得分:5)

你不能用那种方式初始化指针(好吧,你可以,它只是没有指向anythign有效)。这样的事情就是你所追求的:

struct aes_ctx aes_struct = {0};

然后你可以将aes_struct的地址传递给函数,但这取决于你是否需要动态分配这个东西(所需的范围和类型的大小将决定这个)。

因此...

struct aes_ctx aes_struct = {0};
aes_setkey(&aes_struct, aes, CCA_STRENGTH);

或者

struct aes_ctx *aes_struct = malloc(sizeof(struct aes_ctx));
/* you may want to initialize the structure via memset or some init function */
aes_setkey(aes_struct, aes, CCA_STRENGTH);

答案 1 :(得分:2)

关键是你没有初始化一个结构,而是一个指针。这意味着您正在做的是将指针设置为无效地址,这会在尝试访问该地址时导致seg错误。您需要分配内存:

struct aes_ctx* aes_struct = malloc(sizeof(struct aes_ctx));

或创建实际的struct(不是指针)并传递地址:

struct aes_ctx aes_struct = {0};
aes_setkey(&aes_struct, aes, CCA_STRENGTH);

答案 2 :(得分:2)

您没有为指向指针的内存分配内存。你可以使用

struct aes_ctx aes_struct = {0};  // Declare the struct, not a pointer to it
aes_setkey(&aes_struct, aes, CCA_STRENGTH);

或者,如果您想动态分配内存,

struct aes_ctx *aes_struct = malloc(sizeof(struct aes_ctx));
memset(aes_struct, 0, sizeof(struct aes_ctx); // Only if you need to zero the data
aes_setkey(aes_struct, aes, CCA_STRENGTH);

答案 3 :(得分:1)

struct aes_ctx *aes_struct = {0};

通过这样做,您实际上正在初始化aes_struct指针0

两个初始化:

struct aes_ctx *aes_struct = {0};

struct aes_ctx *aes_struct = 0;

是等价的。 C表示在初始化标量时可以添加可选的{}。所以基本上你没有初始化指向成员初始化为零的结构的指针,但是你用空指针常量初始化指针。

虽然,您可以使用复合文字一次性执行前者:

struct aes_ctx *aes_struct = (struct aes_ctx) {0};