我是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。
总结一下这个问题,我认为我初始化结构的方式导致它在以后无法使用。任何可以给我的帮助将非常感激! 谢谢!
答案 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};