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是的,这个操作符并不总是需要括号。但它只是在一些旁注中:)