我在内存中有一个填充的嵌套结构。我想改变几个成员的价值。
struct evp_cipher_ctx_st {
const EVP_CIPHER *cipher;
int somevalue;
} /* EVP_CIPHER_CTX */ ;
这里的密码元素也是一个结构,如下所示:
struct evp_cipher_st {
int nid;
int block_size;
} /* EVP_CIPHER */ ;
我想更改嵌套在EVP_CIPHER_CTX内的结构EVP_CIPHER的“block_size”元素的值。
所以我这样做了:
EVP_CIPHER_CTX ctx;
EVP_CIPHER *MY_EVP_CYPHER;
MY_EVP_CYPHER = (EVP_CIPHER*)ctx.cipher;
MY_EVP_CYPHER -> block_size = 20;
我的程序此时正在崩溃:
37: MY_EVP_CYPHER = (EVP_CIPHER*)ctx.cipher;
00D914C5 8B 85 6C FF FF FF mov eax,dword ptr [ebp-94h]
00D914CB 89 85 60 FF FF FF mov dword ptr [ebp-0A0h],eax
38: MY_EVP_CYPHER -> block_size = 20;
00D914D1 8B 85 60 FF FF FF mov eax,dword ptr [ebp-0A0h]
00D914D7 C7 40 04 11 00 00 00 mov dword ptr [eax+4],11h
有人可以指出问题。
答案 0 :(得分:3)
您在为其分配任何内存之前尝试访问ctx.cipher
。
由于ctx.cipher
是指向EVP_CIPHER
的指针,因此您需要实际创建EVP_CIPHER
并将其地址指定给ctx.cipher
,然后才能使用它。
否则,您正在访问内存中未确定的地址,这很少结束。
如果您提供的示例是如何实例化这些结构,则应执行以下操作:
EVP_CIPHER_CTX ctx;
ctx.cipher = malloc(sizeof(*ctx.cipher));
EVP_CIPHER *MY_EVP_CYPHER;
MY_EVP_CYPHER = (EVP_CIPHER*)ctx.cipher;
MY_EVP_CYPHER -> block_size = 20;
一旦你完成了密码,就不要忘记free
密码。