我有这些功能
char *hash(char *stringa, char *tipohash) {
if (strcmp(tipohash, "md5") == 0) {
stringa = md5(stringa);
}
return stringa;
}
char *md5(char *stringa) {
unsigned char risultato[MD5_DIGEST_LENGTH];
int i;
char *hashfinale = malloc(sizeof(char) * MD5_DIGEST_LENGTH * 2);
MD5((const unsigned char *)stringa, strlen(stringa), risultato);
for (i = 0; i < MD5_DIGEST_LENGTH; i++) {
sprintf(hashfinale + 2 * i, "%02x", risultato[i]);
}
return (char *)hashfinale;
}
如何免费返回(char *)hashfinale
而又不丢失字符串的值?
这是呼叫者
char *hashlinea = hash(stringa, hashType);
答案 0 :(得分:2)
基本上有两种方法可以解决此问题,但它们都不涉及您的代码调用free
。
第一种方法是与现在不做任何不同,只是添加文档,因此hash
函数的用户知道代码必须在返回的指针上调用free
:
// This is the code using your function
char *hashlinea = hash(stringa,hashType);
// Some code using hashlinea
free(hashlinea);
第二种方法是将指针传递给现有数组,并且您的代码使用该数组而不是使用malloc
进行分配:
char hashlinea[MD5_DIGEST_LENGTH*2];
hash(stringa, hashType, hashlinea);
为此,您的hash
函数需要将第三个参数传递给md5
函数,该参数应该使用它而不是分配内存:
char *md5(char *stringa, char *hashfinale){
unsigned char risultato[MD5_DIGEST_LENGTH];
int i;
// No memory allocation here
MD5((const unsigned char *)stringa, strlen(stringa), risultato);
for(i = 0; i < MD5_DIGEST_LENGTH; i++) {
sprintf(hashfinale + 2*i,"%02x",risultato[i]);
}
return hashfinale;
}
答案 1 :(得分:1)
不可能。 IMO最好将指针传递到缓冲区。调用方将负责内存管理
char *md5(char *stringa, char *hashfinale){
...
}
答案 2 :(得分:0)
您的md5
函数中存在一个问题:为空终止符分配给MD5哈希的大小必须长一个字节:
char *hashfinale = malloc(sizeof(char) * (MD5_DIGEST_LENGTH * 2 + 1));
请注意,在C(和C ++)中,sizeof(char)
根据定义是1
,因此您可以这样写:
char *hashfinale = malloc(MD5_DIGEST_LENGTH * 2 + 1);
关于您的问题,hash
返回其自变量或已分配的对象。这是内存管理的问题,因为您可能稍后在程序中不知道是否必须释放返回值。为哈希字符串传递目标数组是一个更好的选择,否则,您应该复制字符串,以便可以无条件释放hash
的返回值:
char *md5(const char *stringa) {
unsigned char risultato[MD5_DIGEST_LENGTH];
int i;
char *hashfinale = malloc(MD5_DIGEST_LENGTH * 2 + 1);
MD5((const unsigned char *)stringa, strlen(stringa), risultato);
for (i = 0; i < MD5_DIGEST_LENGTH; i++) {
sprintf(hashfinale + 2 * i, "%02x", risultato[i]);
}
return hashfinale;
}
// always free the return value
char *hash(const char *stringa, const char *tipohash) {
if (!strcmp(tipohash, "md5")) {
return md5(stringa);
} else {
return strdup(stringa);
}
}