c - 由于 printf 不起作用,如何查看 char * 的内容?

标签 c hash return char-pointer

这是我的代码片段:

#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);
}

所以 main 函数接受参数 fine(tested) 并传递给它 fine(tested) 但是 hash() 函数虽然计算了散列,但没有返回正确的值或者我无法在 main 中打印结果。从昨天开始,我一直在尝试检查错误,但我不是很聪明,所以非常感谢任何帮助!

最佳答案

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

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

关于c - 由于 printf 不起作用,如何查看 char * 的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23017582/

相关文章:

c++ - 我正在尝试运行这个程序,但它给出了错误 initwindow() not initialized

Python 无法返回最终值

java - 'public Boolean isBikeTyreFlat()' 是有效的 JavaBeans 方法签名吗?

c - 赋值后访问 char* C

c - 如何在不同位置打开文件?

c++ - 如何在 Solaris 10 上替换 posix_memalign

java - 哪个 SHA-256 是正确的? Java SHA-256 摘要或 Linux 命令行工具

c# - 如何散列密码

php - password_hash 等同于 php 5.4?

java - 一个方法可以在 Java 中返回两个值吗?