1

所以我正在学习指针并且很难在这里识别内存泄漏。我承认我以前从未使用过 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;
}
4

4 回答 4

3

规则相当简单,每个 malloc 都必须有一个 free。如果你的 malloc 比 frees 多,那么你忘记了释放内存,所以你有内存泄漏。如果您有比 malloc 更多的空闲空间,那么您正在尝试取消分配已经被取消分配的内存,这不是您想要的。

于 2012-09-23T01:37:40.823 回答
2

当您不再需要缓冲区时,您只需使用该函数释放缓冲区:free()

    /* ... */
    free( buffer );
    return 0;
}

当内存不再使用时,只需记住平衡每次调用malloc与调用。free

p变量的操作不会影响buffer. 它们是指向同一区域的两个指针(在开始时),但它们仍然是两个不同的变量。所以递增p不会递增buffer
所以指针操作没有错p,除了你写的越界,正如丹尼尔费舍尔在你的问题评论中所说的那样。

另请注意,您还应该在通话后始终检查NULL,可能会失败。现在很少见了,但是如果失败了,你的程序可能会崩溃,因为你会取消引用一个指针:mallocmallocNULL

buffer = malloc( 10 );

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

char *不需要强制转换为,malloc除非您正在处理 C++。在 C 中,将 a 分配void pointer给另一个指针类型是有效的。

于 2012-09-23T01:37:28.410 回答
2

你打电话malloc,从不打电话free。当然会泄漏。

原则上,您从函数族请求的每个分配都alloc应该在free您完成它们后立即进行编辑。

您在程序终止之前继续使用的缓冲区在形式上是泄漏,但只要您分配了明确定义的数量,就不是问题。这包括你在这里做的事情。

于 2012-09-23T01:38:02.483 回答
2

你想要的不是 n<=10,而是 n<10。

于 2012-09-23T01:38:15.273 回答