在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中的一个基本问题,我只是不知道正确的方法来解决这个问题 我在网上发现了许多类似的帖子,但没有一个有明确或好的解决方案。
答案 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);