【问题标题】:Where's the memory leak?内存泄漏在哪里?
【发布时间】:2026-01-05 09:25:02
【问题描述】:

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

【问题讨论】:

  • 你写的越界了,你只有10个chars的空间,但是写11个。

标签: pointers memory-leaks pointer-arithmetic


【解决方案1】:

规则很简单,每个 malloc 都必须有一个 free。如果你的 malloc 比 free 多,你忘了释放内存,所以你有内存泄漏。如果你有比 malloc 更多的空闲空间,那么你正试图释放已经被释放的内存,这不是你想要的。

【讨论】:

    【解决方案2】:

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

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

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

    p 变量的操作不会影响buffer。它们是指向同一区域(开始时)的两个指针,但它们仍然是两个不同的变量。所以增加p 不会增加buffer
    因此,p 上的指针操作没有任何问题,除了您 超出范围,正如 Daniel Fisher 在您问题的 cmets 中所述。 p>

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

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

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

    【讨论】:

      【解决方案3】:

      你想要的不是 n

      【讨论】:

        【解决方案4】:

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

        原则上,您从alloc 函数系列请求的每个分配都应该在您完成后立即进行freeed。

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

        【讨论】: