0

正如本主题的主题。我有一个简单的功能:

char *to_str(int x)
{
    char *s = malloc(6);

    if (s == NULL) {
        error("malloc");
    }

    snprintf(s, sizeof(s), "%d", x);
    return s;
}

它在它的主体中分配内存,并返回这样的值。我应该如何处理内存释放?最好的方法是什么?

4

4 回答 4

4

我应该如何处理内存释放?

小心。而且绝对比你现在做的更好。

最好的方法是什么?

最好的方法是free()当你不再需要它时记忆:

char *str = to_str(1337);
// do stuff with `str'
free(str);

同样,这sizeof()是错误的。它为您提供指针的大小,而不是缓冲区的大小。您需要自己跟踪它。

于 2013-04-21T12:38:34.617 回答
1

调用代码需要使用以下方法释放内存free()

void f(int x)
{
    char *s = to_str(x);
    // ...
    free(s);
}

(顺便说一句,您有一个错误: in to_strsizeof(s)是指针的大小,而不是指向的字符串的长度s。)

于 2013-04-21T12:36:09.703 回答
0

The best is not to allocate memory inside function:

 char* to_str(char *buffer, size_t buffer_size, int x);

this way you don't have to care about deallocation inside the function and everything is on the caller side.

If you want to create function with the signature you have in the question, you cannot use that in anything like printf("%s", to_str(x)), because this would be a memory leak. You have to make char *str = to_str(x); printf("%s", str); free(str); which is not nice...

于 2013-04-21T14:51:26.123 回答
0

首先,sizeof()是一个运算符,它在括号中为您提供类型(变量类型)的字节长度。因此,您得到的不是分配的内存块的实际长度,而是指针的大小s,这通常不是您所期望的。

第二,在分配内存时,要了解它没有实际使用的时刻,并free()在它上面做。

另外,我不确定5符号+终止0是否足够长的字符串,因为如果字符串中的垃圾x会更长,那么您可能会破坏内存。

于 2013-04-21T12:57:56.553 回答