函数内的free char指针

时间:2012-08-28 10:37:59

标签: c function-pointers

主:

char *tmpip;
tmpip = get_public_ip();

function get_public_ip:

char * get_public_ip(void){
    char *ipresult;

    if(((ipresult = malloc(17))) == NULL){
        perror("malloc on pub ip");
        exit(1);
    }


    if(fgets(ipresult, 16, tmpfp) == NULL){
        perror("fgets error pubip");
        exit(1);
    }
    fclose(tmpfp);
    return ipresult;
}

我的问题是:
在主free(tmpip)内进行是好事还是错了?

3 个答案:

答案 0 :(得分:4)

这是一种很好的编码方式:你malloc()函数中的一些内存,而free()则不再需要它。请务必评论您的函数或原型malloc()所需的内存,因此您知道必须free()

答案 1 :(得分:1)

为什么会出错?你实际上没有任何其他选项可以在其他地方释放分配的缓冲区...在C语言中调用一个分配内存的函数,然后使调用者(外部)函数可以释放该内存。

答案 2 :(得分:1)

如果使用动态分配,那么用free(tmpip)释放指针肯定是好的!函数get_public_ip只需要记录释放资源,调用者必须确保在返回值上调用free

另一种方法是提供一个函数void free_public_ip(char*buf) {free(buf);},并记录释放调用者必须使用的资源。这为您提供了一些灵活性,可以在不调用代码更改的情况下更改内存的分配方式。这当然没有必要。

在我看来,malloc像这样的小型固定大小的缓冲区并没有多大意义。 get_public_ip的标头文件可以#define PUBLIC_IP_SIZE (17)并获取char*参数,然后调用者可以执行此操作:

char tmpip[PUBLIC_IP_SIZE];
get_public_ip(tmpip);
// no more thinking required

而不是:

char *tmpip = get_public_ip();
// code here, perhaps does more things that could fail, 
// maybe some thinking required to ensure every code path passes through:
free(tmpip);

如果这个号码17将来没有机会重新编译调用代码(例如,如果这是一个库而你需要二进制兼容性),那么动态分配将是合理的。