Pointers 其中';内存泄漏是什么原因?

Pointers 其中';内存泄漏是什么原因?,pointers,memory-leaks,pointer-arithmetic,Pointers,Memory Leaks,Pointer Arithmetic,所以我正在学习指针,在这里很难识别内存泄漏。我承认我以前从未使用过malloc(),而且我对指针算法还是新手。提前谢谢 /*文件名:p3.c*/ #包括 #包括 int main() { 字符*缓冲区; char*p; int n; /*分配10字节*/ 缓冲区=(字符*)malloc(10); p=缓冲区; 对于(n=0;n当不再需要缓冲区时,只需使用free()函数释放缓冲区即可: /* ... */ free( buffer ); return 0; } 只要记住

所以我正在学习指针,在这里很难识别内存泄漏。我承认我以前从未使用过malloc(),而且我对指针算法还是新手。提前谢谢

/*文件名:p3.c*/
#包括
#包括
int main()
{
字符*缓冲区;
char*p;
int n;
/*分配10字节*/
缓冲区=(字符*)malloc(10);
p=缓冲区;

对于(n=0;n当不再需要缓冲区时,只需使用
free()
函数释放缓冲区即可:

    /* ... */
    free( buffer );
    return 0;
}
只要记住,当内存不再使用时,通过调用
free
来平衡
malloc
的每次调用

p
变量的操作不会影响
buffer
。它们是指向相同区域的两个指针(在开始时),但它们仍然是两个不同的变量。因此增加
p
不会增加
buffer

因此,在
p
上的指针操作没有任何错误,除了Daniel Fisher在您的问题的评论中指出的事实,您正在写越界

还要注意的是,在调用
malloc
之后,您还应该始终检查
NULL
,因为
malloc
可能会失败。现在这种情况非常罕见,但如果失败,您的程序可能会崩溃,因为您将取消引用
NULL
指针:

buffer = malloc( 10 );

if( buffer == NULL )
{
    /* Error management - Do not use buffer */
}

MalOC><代码>中不需要强制转换为<代码> char */COD>,除非您正在处理C++。在C中,将“代码”>空指针< /代码>赋值给另一个指针类型是有效的。

< P>您只需要在<不使用缓冲区> < /P> >使用<代码>自由(<)>代码>函数>缓冲区>
    /* ... */
    free( buffer );
    return 0;
}
只要记住,当内存不再使用时,通过调用
free
来平衡
malloc
的每次调用

p
变量的操作不会影响
buffer
。它们是指向相同区域的两个指针(在开始时),但它们仍然是两个不同的变量。因此增加
p
不会增加
buffer

因此,在
p
上的指针操作没有任何错误,除了Daniel Fisher在您的问题的评论中指出的事实,您正在写越界

还要注意的是,在调用
malloc
之后,您还应该始终检查
NULL
,因为
malloc
可能会失败。现在这种情况非常罕见,但如果失败,您的程序可能会崩溃,因为您将取消引用
NULL
指针:

buffer = malloc( 10 );

if( buffer == NULL )
{
    /* Error management - Do not use buffer */
}

MalOC>/COD>中不需要强制转换为“代码> char */COD>,除非您正在处理C++。在C中,将一个<代码>空指针分配给另一个指针类型是有效的。

< P>规则是相当简单的,对于每个Maloc必须有一个空闲。如果您有更多的MalCOLs而不是FRILE,则忘记分配内存,因此您有备忘录。ry泄漏。如果您的空闲空间比malloc多,则您正在尝试取消分配已取消分配的内存,而这不是您想要的。

规则非常简单,对于每个malloc,必须有一个空闲空间。如果您的malloc比空闲空间多,则您忘记取消分配内存,因此您存在内存泄漏。如果您的空闲空间比空闲空间多,则n mallocs您正在尝试取消分配已经取消分配的内存,而这些内存不是您想要的。

您调用
malloc
,但从未调用
free
。当然,它会泄漏

原则上,您从
alloc
函数系列请求的每一次分配都应在完成后立即免费
分配


您在程序终止前继续使用的缓冲区是正式泄漏,但只要您分配了定义明确的缓冲区数量,就不成问题。这包括您在这里所做的工作。

您调用
malloc
,而从不调用
free
。当然,它会泄漏

原则上,您从
alloc
函数系列请求的每一次分配都应在完成后立即免费
分配


在程序终止前继续使用的缓冲区是正式的泄漏,但只要分配了定义好的缓冲区数量,就不成问题。这包括您在这里所做的工作。

这不是n这不是nAnd,您写的不是nAnd,您只有10个
字符的空间,而是写11个字符的空间。您写越界,您只有10
char
s的空间,但写11。