c-如何在释放内存的同时返回指针



我有这些函数

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

基本上有两种方法来解决这个问题,其中没有一种涉及到您的代码调用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;
}

这是不可能的。IMO最好将指针传递到缓冲区。调用方将负责内存管理

char *md5(char *stringa, char *hashfinale){
...
}

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

相关内容

  • 没有找到相关文章

最新更新