C 如何释放内存并同时返回指针?

C 如何释放内存并同时返回指针?,c,memory,memory-management,malloc,free,C,Memory,Memory Management,Malloc,Free,我有这些功能 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 *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 *md5(char *stringa, char *hashfinale){
 ...
}

基本上有两种方法可以解决这个问题,其中没有一种涉及到你的代码调用
免费


第一种方法是不做任何与现在不同的事情,只是添加文档,以便
散列
函数的用户知道代码必须在返回的指针上调用
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;
}
char*md5(char*stringa,char*hashfinale){
无符号字符risultato[MD5_DIGEST_LENGTH];
int i;
//这里没有内存分配
MD5((常量无符号字符*)stringa、strlen(stringa)、risultato);
对于(i=0;i
您的
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
返回其参数或分配的对象。这是内存管理的一个问题,因为您可能不知道稍后在程序中是否必须释放返回值。传递哈希字符串的目标数组是更好的选择,否则应复制字符串,以便无条件释放
哈希
的返回值:

char*md5(const char*stringa){
无符号字符risultato[MD5_DIGEST_LENGTH];
int i;
char*hashfinale=malloc(MD5_DIGEST_LENGTH*2+1);
MD5((常量无符号字符*)stringa、strlen(stringa)、risultato);
对于(i=0;i
将函数记录为返回需要传递到
free
的指针,并让被调用方处理它。或者,您可以修改签名以获得指向数组第一个字符(加上数组长度)的a指针,并使用该指针,没有函数的任何动态分配。@某个程序员,我不明白你说了什么问题是,如果你在函数中释放指针,它就不再可用,因此返回它会调用未定义的行为,你应该像返回指针一样,在使用返回的指针后,在调用函数的任何地方释放它。我不明白你的问题是什么。是否要返回指向字符串的指针?如果是,则需要返回一个未释放的指针。如果没有,为什么要返回指针/值?问题是,如果从调用方释放它,它将填充内存,因此我认为必须在called@helloworld你的整个想法似乎不完整。我暗示回到你问题的评论部分。如果你更多地考虑你想做什么,这种方法是最好的。尽管这个答案在信息方面有点罕见,但我还是投了赞成票,因为它表明了可能正确的解决方案。
char *hashfinale = malloc(MD5_DIGEST_LENGTH * 2 + 1);