为什么不把创建的地址内存释放呢

img

若释放p内存,ptr不还是一直在占用内存吗,ptr为什么不释放掉呢

p = ptr
所以p和ptr是一回事
释放的是那个地址,而不是变量名。

【以下回答由 GPT 生成】

问题描述: 在给定的C语言代码中,通过malloc函数分配内存给指针p,然后通过realloc函数重新分配内存给ptr。之后,打印出ptr指向的内存地址中的值,并通过free函数释放p指向的内存。然而,ptr指向的内存仍然占用内存,而未被释放。

原因解释: 问题在于对realloc函数的理解。realloc用于重新分配内存,并且具有以下两种情况: 1. 如果传入的第一个参数指针是NULL,表示realloc会像malloc一样分配新的内存。 2. 如果传入的第一个参数指针不是NULL,那么realloc将尝试重新分配传入的指针指向的内存。如果成功,会返回一个指向新分配内存的指针;如果失败,仍然返回原来的指针。

在代码中,ptr实际上是由realloc函数返回的指针,它指向的是realloc重新分配的内存。这意味着p和ptr指向的是同一块内存。因此,在释放p指向的内存之后,ptr指向的内存没有被释放,因为它们实际上是同一个内存块。

解决方案: 可以通过两种方式解决这个问题:

  1. 只使用malloc函数分配内存: 将代码中的realloc函数替换为malloc函数,并删除realloc之后的代码行。这样,你将只有一个指针指向内存,并且可以通过free函数释放它。
#include <stdio.h>
#include <stdlib.h>

int main() {
    int* p = (int*)malloc(INT_MAX);

    if (p != NULL) {
        int i;
        for (i = 5; i < 10; i++) {
            *(p+i) = i;
        }

        for (i = 0; i < 10; i++) {
            printf("%d\n", *(p+i));
        }

        free(p);
        p = NULL;
    }

    return 0;
}
  1. 使用两个不同的指针: 在代码中,使用两个不同的指针来分配内存和重新分配内存。这样,在释放p指向的内存后,ptr指向的内存仍然有效。
#include <stdio.h>
#include <stdlib.h>

int main() {
    int* p = (int*)malloc(INT_MAX);
    int* ptr = realloc(p, INT_MAX);

    if (ptr != NULL) {
        int i;
        for (i = 5; i < 10; i++) {
            *(ptr+i) = i;
        }

        for (i = 0; i < 10; i++) {
            printf("%d\n", *(ptr+i));
        }

        free(ptr);
        ptr = NULL;
    }

    return 0;
}

请注意,在第二种解决方案中,realloc可能会改变指针的值,因此需要更新ptr的值。

希望这些解决方案对你有帮助。如果你有任何其他问题,请随时提问!



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^