0

我一直在这段代码上遇到分段错误,我现在正在学习 C ..有人可以帮我吗?

错误位置:

char *m;
char *as = concat("helloworld", buf);
*m = sha1(as);                               <<<<<< as
printf("%s\n", m);
free(as);

concat 函数(不是我的,用于连接 2 个字符串):

char* concat(char *s1, char *s2)
{
    size_t len1 = strlen(s1);
    size_t len2 = strlen(s2);
    char *result = malloc(len1+len2+1);//+1 for the zero-terminator
    //in real code you would check for errors in malloc here
    memcpy(result, s1, len1);
    memcpy(result+len1, s2, len2+1);//+1 to copy the null-terminator
    return result;
}

sha1 函数:

char *sha1( char *val ){

   int msg_length = strlen( val );
   int hash_length = gcry_md_get_algo_dlen( GCRY_MD_SHA1 );
   unsigned char hash[ hash_length ];
   char *out = (char *) malloc( sizeof(char) * ((hash_length*2)+1) );
   char *p = out;
   gcry_md_hash_buffer( GCRY_MD_SHA1, hash, val, msg_length );
   int i;
   for ( i = 0; i < hash_length; i++, p += 2 ) {
      snprintf ( p, 3, "%02x", hash[i] );
   }
   return out;
}

既然我在问,它们是什么意思:

 //in real code you would check for errors in malloc here

提前致谢

4

4 回答 4

1

sha1()返回char *,因此您需要更改*m = sha1(as);m = sha(as);. *m是类型char,不是char *

于 2013-09-26T13:29:07.860 回答
1

更改*m = sha1(as);m = sha1(as);. *m是一个char值而不是一个char *

现在第二个问题:

在实际代码中,您将在此处检查 malloc 中的错误

都是关于错误处理的,你需要检查返回的malloc指针NULL

于 2013-09-26T13:29:15.267 回答
1
m = sha1(as); 

*m取消引用指针,它表示指针下的字符。

至于malloc,如果它不能分配内存 if 将返回一个NULL指针。你应该检查一下。

于 2013-09-26T13:29:40.887 回答
-2

问题出在 *m 中:

char *m = sha1("helloworld");    < OK
*m = sha1("helloworld");         < fail
于 2013-09-26T13:39:34.817 回答