所以我学习指针并且很难在这里识别内存泄漏。我承认我之前从未使用过malloc(),而且我是指针算法的新手。提前谢谢。
/*filename: p3.c */
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *buffer;
char *p;
int n;
/* allocate 10 bytes */
buffer = (char *) malloc(10);
p = buffer;
for (n=0; n<=10; n++)
*p++ = '*';
p = buffer;
for (n=0; n <=10; n++)
printf("%c ", *p++);
return 0;
}
答案 0 :(得分:3)
规则相当简单,每个malloc必须有一个免费的。如果你有更多mallocs而不是frees你忘了取消内存,所以你有内存泄漏。如果你有比malloc更多的空闲,你试图取消分配已经解除分配的内存,而这不是你想要的。
答案 1 :(得分:2)
当您不再需要缓冲区时,只需使用free()
函数释放缓冲区:
/* ... */
free( buffer );
return 0;
}
只需记住平衡每次拨打malloc
,拨打free
,再次使用内存时。
p
变量上的操作不会影响buffer
。它们是指向相同区域(开始时)的两个指针,但它们仍然是两个不同的变量。因此递增p
不会增加buffer
所以p
上的指针操作没有任何问题,除了写出界限之外,正如 Daniel Fisher 在您的问题评论中所述。
另请注意,在NULL
来电之后,您应始终检查malloc
,因为malloc
可能会失败。现在这种情况非常罕见,但是如果它失败了,你的程序可能会崩溃,因为你将取消引用NULL
指针:
buffer = malloc( 10 );
if( buffer == NULL )
{
/* Error management - Do not use buffer */
}
除非您正在处理C ++,否则char *
上不需要转换为malloc
。在C中,将void pointer
分配给另一个指针类型是有效的。
答案 2 :(得分:2)
您致电malloc
,永远不会致电free
。当然它泄漏了。
原则上,您alloc
系列功能请求的每个分配都应在free
完成后立即执行。
您继续使用直到程序终止的缓冲区正式泄漏,但只要您分配明确定义的数量,就不会出现问题。这包括你在这里做的事情。
答案 3 :(得分:2)
你想要的不是n <= 10,但是n <10。