嵌套结构值

时间:2016-06-09 08:49:58

标签: c

我在内存中有一个填充的嵌套结构。我想改变几个成员的价值。

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  

有人可以指出问题。

1 个答案:

答案 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密码。