strcpy()不工作

strcpy()不工作,c,string,C,String,我试图找到一个数字的散列并使用strcpy()复制到一个字符串,但复制操作无法正常工作。 这是我的密码: #include<stdio.h> #include<string.h> #include<stdlib.h> #include <openssl/sha.h> #define DIGEST_LENGTH 4 unsigned char *perform_hash(unsigned char *string){ unsigne

我试图找到一个数字的散列并使用strcpy()复制到一个字符串,但复制操作无法正常工作。 这是我的密码:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <openssl/sha.h>

#define DIGEST_LENGTH 4
unsigned char *perform_hash(unsigned char *string){
        unsigned char *temp_hash = NULL;
        unsigned char digest[DIGEST_LENGTH], mdString[DIGEST_LENGTH*2+1];
        int i = 0;
        SHA_CTX ctx;
        SHA1_Init(&ctx);
        SHA1_Update(&ctx, string, strlen(string));
        SHA1_Final(digest, &ctx);

        for (i = 0; i < DIGEST_LENGTH; i++)
                sprintf(&mdString[i*2], "%02x", (unsigned int)digest[i]);
        printf("SHA1 digest{%s}: %s\n",string,mdString);
        temp_hash = mdString;
        printf("\nRET HASH:::%s",temp_hash);
        return temp_hash;
}

void main(){
        char *temp = NULL;
        unsigned char *hash_nonce = (unsigned char *)malloc(sizeof(unsigned char)* 50);// FREEEEEE
        memset(hash_nonce, 0,50);
        temp = perform_hash("7c1824c5");
        strcpy(hash_nonce,temp);
        printf("\nHASH_NONCE:::%s\n",hash_nonce);
        temp = NULL;
}
#包括
#包括
#包括
#包括
#定义摘要长度4
无符号字符*执行哈希(无符号字符*字符串){
无符号字符*temp_hash=NULL;
无符号字符摘要[digest_LENGTH],mdString[digest_LENGTH*2+1];
int i=0;
沙乌CTX CTX;
SHA1_Init(&ctx);
SHA1_更新(&ctx,字符串,strlen(字符串));
SHA1_期末考试(摘要和ctx);
对于(i=0;i
输出:

SHA1摘要{7c1824c5}:c79851b5

RET哈希:::c79851b5

HASH_NONCE:::�9�

使用strncpy()而不是strcpy()

strncpy(hash_nonce,temp,strlen(temp))

输出:

SHA1摘要{7c1824c5}:c79851b5

RET哈希:::c79851b5

HASH_NONCE:::


temp_hash=mdString

mdString
是一个局部变量,一旦函数结束,它就超出范围。当它的生命周期结束时,您正在访问它,调用未定义的行为(您在
strcpy()
中访问它)摆脱这种分配动态内存的方式

char *mdString = malloc(DIGEST_LENGTH*2+1);

在动态分配后进行适当检查,并在处理后释放

这不是更好吗:
unsigned char*perform\u hash(unsigned char*string,unsigned char*result)@Yashas.:那是另一种情况。您正在传递我猜想的数组(该数组衰减为指针)…并将散列存储在
result
中。这很有效。这里我展示了OP的程序行为失控的地方。@coderedoc mdString被分配给temp_hash,以避免complie time警告“警告:函数返回局部变量的地址[-Wreturn local addr]return mdString;”@paru.:Yes,这就是问题的原因。您正在访问不应该访问的内存。这就是为什么编译器也会给出警告。函数返回当函数调用结束时存储持续时间结束的局部变量地址。就这样。然后如果你通过了,那就是错误了。你不认为从一个参数中获取存储空间比这里的
malloc
更有意义吗?你在读哪本书?因为这只是许多常见错误中的一个,这些错误在早期的书中都会提到。。。我希望你不要重复常见问题……除了返回无效内存的问题之外,你还有另一个问题<代码>strncpy(散列、临时、strlen(临时))
这不会复制字符串的终止
\0
,因为
strlen
几乎总是太短一个字节。此外,如果要在其他语言中实现此算法,请小心将nonce作为字符串传递给SHA。字符->字节的转换取决于字符集。由于nonce看起来是十六进制的,因此使函数采用字节数组和长度将更易于移植。