在c中返回malloc数据的替代方法?

时间:2014-04-17 05:06:17

标签: c memory malloc

在C中,我有这个功能:

// Returns human friendly byte amount
char *byteconvert(unsigned long b_) {
    float b = (float) b_;
    int n = 0;
    while (b / 1000 >= 1) {
        b /= 1000;
        n++;
    }
    char *buffer = malloc(32);
    sprintf(buffer, "%.2f%c", b, "BKMGT"[n]);
    return buffer;
}

我是否只为此函数调用分配一个变量,然后在以后释放它?如果我想打印它会怎么样:

int x = 123456;
printf("Size: %s\n", byteconvert(x));

如何在没有内存泄漏的情况下执行此操作?这似乎是C中的一个基本问题,我只是不知道正确的方法来解决这个问题 我在网上发现了许多类似的帖子,但没有一个有明确或好的解决方案。

3 个答案:

答案 0 :(得分:1)

如果您不想依赖调用者执行free,那么首先让调用者在缓冲区中传递。

另外,在将n < 5用作数组索引之前,您应该检查它。

void byteconvert(unsigned long b_, char *buf, size_t buf_len )
{
    ...
    snprintf(buf, buf_len, "%.2f%c", .....
}

答案 1 :(得分:0)

你的直觉是正确的。将byteconvert()返回的指针存储在变量中,并在不再需要时将其释放。

答案 2 :(得分:0)

  

如何在没有内存泄漏的情况下执行此操作?

使用后需要释放内存。

int x = 123456;
char * temp = NULL;

temp = byteconvert(x);
printf("Size: %s\n", temp);

//after use just free it
free(temp);