Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何释放函数中分配的内存_C_Unix_Memory_Malloc_Free - Fatal编程技术网

C 如何释放函数中分配的内存

C 如何释放函数中分配的内存,c,unix,memory,malloc,free,C,Unix,Memory,Malloc,Free,和这个话题的主题一样。我有一个简单的功能: char *to_str(int x) { char *s = malloc(6); if (s == NULL) { error("malloc"); } snprintf(s, sizeof(s), "%d", x); return s; } char* to_str(char *buffer, size_t buffer_size, int x); 在它的主体中分配内存,并返回这样

和这个话题的主题一样。我有一个简单的功能:

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

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

    snprintf(s, sizeof(s), "%d", x);
    return s;
}
 char* to_str(char *buffer, size_t buffer_size, int x);

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

调用代码需要使用
free()
释放内存:


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

调用代码需要使用
free()
释放内存:

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

我应该如何处理内存释放

小心地。而且肯定比你现在做的更好

最好的方法是什么

最好的方法是在不再需要内存时
释放()
内存:

char *str = to_str(1337);
// do stuff with `str'
free(str);
而且,该
sizeof()
是错误的。它提供指针的大小,而不是缓冲区的大小。你需要自己跟踪它

我应该如何处理内存释放

小心地。而且肯定比你现在做的更好

最好的方法是什么

最好的方法是在不再需要内存时
释放()
内存:

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

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

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

第二,当您分配内存时,您应该了解它没有实际使用的时刻,并在其上设置
free()


另外,我不确定
5
symbols+终止
0
是否足够长的字符串,就像
x
中的垃圾一样,字符串会更长,因此可能会损坏内存。

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

第二,当您分配内存时,您应该了解它没有实际使用的时刻,并在其上设置
free()


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

最好不要在函数中分配内存:

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

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

    snprintf(s, sizeof(s), "%d", x);
    return s;
}
 char* to_str(char *buffer, size_t buffer_size, int x);
这样,您就不必关心函数内部的解除分配,一切都在调用方


如果要使用问题中的签名创建函数,则不能在类似于
printf(“%s”,to_str(x))
的任何操作中使用该签名,因为这将导致内存泄漏。你必须使
char*str=to_str(x);printf(“%s”,str);自由基(str)这不好…

最好不要在函数中分配内存:

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

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

    snprintf(s, sizeof(s), "%d", x);
    return s;
}
 char* to_str(char *buffer, size_t buffer_size, int x);
这样,您就不必关心函数内部的解除分配,一切都在调用方


如果要使用问题中的签名创建函数,则不能在类似于
printf(“%s”,to_str(x))
的任何操作中使用该签名,因为这将导致内存泄漏。你必须使
char*str=to_str(x);printf(“%s”,str);自由基(str)这不好…

但它是char*(函数)。。。这个问题看起来更像是在问,哪里是解除分配的最佳方案…@V-X你到底在说什么?这个答案是正确的@V-X:我既不理解你的评论,也不理解你的否决票——你能更详细地解释一下我误解的地方吗?问题是关于将指针传递到函数之外,而你提出的函数没有返回任何内容。大小是这个答案的唯一优点。@V-X:你误解了我的答案。我的答案中的函数是调用问题中的函数的代码,
到_str
,然后释放它返回的内存。但它是char*(函数)。。。这个问题看起来更像是在问,哪里是解除分配的最佳方案…@V-X你到底在说什么?这个答案是正确的@V-X:我既不理解你的评论,也不理解你的否决票——你能更详细地解释一下我误解的地方吗?问题是关于将指针传递到函数之外,而你提出的函数没有返回任何内容。大小是这个答案的唯一优点。@V-X:你误解了我的答案。我的答案中的函数是调用问题中的函数的代码,
调用它,然后释放它返回的内存。使用
malloc
分配的内容将使用
free
释放。使用
malloc
分配的内容将使用
free
释放。谢谢。我不得不查找那首歌,确实有一些相似之处。就我个人而言,我不喜欢写“
sizeof()
”(带括号),因为那样的话,它看起来就像一个函数。为什么不“
sizeof
”?但是还是+1。@Kirilenko是的,这个操作符并不总是需要括号。不过这只是旁注:)@NPE谢谢。我不得不查找那首歌,确实有一些相似之处。就我个人而言,我不喜欢写“
sizeof()
”(带括号),因为那样的话,它看起来就像一个函数。为什么不“
sizeof
”?但是还是+1。@Kirilenko是的,这个操作符并不总是需要括号。但它只是在一些旁注中:)