1

这是我的代码片段:

#include <stdio.h>
#include "uhash.h"
#include <openssl/evp.h>


char * hash(item  a)
{
    const char * str= a.k;
    int len= strlen(str);

    int md_len;
    unsigned char md_value[EVP_MAX_MD_SIZE];    /* Buff to store change result */
        EVP_MD_CTX *mdctx;              /* Digest data structure declaration */
        const EVP_MD *md;  
    OpenSSL_add_all_digests();
        md = EVP_get_digestbyname("SHA256");
        mdctx = EVP_MD_CTX_create();
        EVP_DigestInit_ex(mdctx, md, NULL);
        EVP_DigestUpdate(mdctx, str, len);
        EVP_DigestFinal_ex(mdctx, md_value, &md_len);
        EVP_MD_CTX_destroy(mdctx);

    char md5str[33];
    for(int i=0;i<md_len;++i)
    {
        sprintf(&md5str[i*2],"%02x",(unsigned int)md_value[i]);
    }
    printf("%s\n", md5str);
    return md5str;
}
int main(int argv, char **argc)
{
    char *c;
    if (argv>0)
    {
        int i=0;
        int s=0;
        for(i=1;i<argv;i++)
        {
            s+=strlen(argc[i]);
        }
        c=(char *)(malloc(sizeof(char)*s*(argv-2)+1));
        s=0;
        for(i=1;i<argv;i++)
        {
            char *t=c+s;
            memcpy(t,argc[i],strlen(argc[i]));
            if(i!=argv-1){
                    printf("%d\n", argv);
                    t[strlen(argc[i])]=' ';
                s++;
            }
            s+=strlen(argc[i]);
        }
        *(c+s)='\0';
    }
    printf("%s\n", c);
    item * kee= malloc(sizeof(item));
    kee->k=c;
    kee->v=10;
    char *res= hash(*kee);
    fflush(stdout);
    if(res==NULL)
        printf("result is null...");
    else
        printf("%s\n",res);
    fflush(stdout);
}

所以主函数接受参数很好(测试)并通过它很好(测试)但是 hash() 函数虽然计算了哈希值,但没有返回正确的值,或者我无法在 main 中打印结果。从昨天开始,我一直在尝试检查错误,但我不是很聪明,所以任何帮助将不胜感激!

4

1 回答 1

2

根本原因:您正在返回已在堆栈上创建的东西,一旦返回,它就会被擦除。res 指向你的堆栈。

修复:将 md5str 的声明放在例程散列之外或使其在例程散列中静态。

于 2014-04-11T16:58:32.157 回答