Поскольку вы хотите дублировать, хранить, сравнивать, освобождать и, возможно, дайджест MD5, просто создайте тип md5_t
и напишите соответствующие функции для управления им, например:
typedef char md5_t[16];
md5_t *md5_new( MD5_CTX *pMD5Context )
{
md5_t *pMD5 = malloc( sizeof( md5_t ) );
memcpy( pMD5, pMD5Context->digest, 16 );
return pMD5 ;
}
int md5_cmp( md5_t *pMD5A, md5_t *pMD5B )
{
return memcmp( pMD5A, pMD5B, 16 );
}
void md5_print( md5_t *pMD5 )
{
...
}
void md5_free( md5_t *pMD5 )
{
free( pMD5 );
}
И так далее ... Далее, создайте тип для вашего массива MD5 и простые функции для управления им:
typedef struct md5array_t {
unsigned int uSize ;
md5_t **ppMD5 ;
}
md5array_t *md5array_new()
{
md5array_t *pArray = malloc( sizeof( md5array_t );
pArray->uSize = 0 ;
pArray->ppMD5 = NULL ;
}
md5array_t *md5array_add( md5array_t *pArray, md5_t *pMD5 )
{
pArray->uSize ++ ;
pArray = realloc( pArray, pArray->uSize + sizeof( md5_t * ) );
pArray->ppMD5[ pArray->uSize-1 ] = pMD5 ;
}
md5_t *md5array_get( md5array_t *pArray, unsigned int uIndex )
{
return pArray->ppMD5[ uIndex ];
}
void md5array_free( md5array_t *pArray }
{
/* I let you find what to write here.
Be sure to read AND understand the previous
functions. */
}
Для возобновления: создайте тип и функции, которыми вы должны манипулировать им, как только вы захотите выполнить более одной операции с датумом. Вам не нужно создавать настоящий универсальный тип с полнофункциональными функциями, представляющими столько операций, сколько вы можете себе представить для этого типа: просто кодируйте то, что вам нужно. Например, в md5array_t вы можете добавить md5_t *
, но не можете удалить его (если вы не напишите функцию void md5array_del( md5array_t *pArray *, int iIndex )
.
P.S. : мой код C здесь для того, чтобы «проиллюстрировать» мою точку зрения, а не для того, чтобы ее можно было использовать, просто скопировав / вставив ее как есть ...