如果我将一个 malloc 变量设置为等于另一个 malloc 变量会发生什么

What happens if I set one malloc variable equal to another malloc variable

我想知道这段代码发生了什么?

在这里,我在 func2 中有一个变量 f2,它通过 malloc 分配了一个 space 块,在 func1 也通过 malloc.

分配了一块 space
#include <stdio.h>
#include <stdlib.h>

char* func2(){
    char *f2 = (char *)malloc (sizeof(char) * 10);
    
    f2[0] = '1';
    f2[1] = '2';
    f2[2] = '3';
    f2[3] = '[=10=]';
    
    return f2;
}

char* func1(){
    char *f1 = (char *)malloc (sizeof(char) * 10);
    
    f1 = func2();
    
    return f1;
}

int main()
{
    printf("String: %s", func1());

    return 0;
}

现在,由于我在 func2 中分配了堆内存,并且 func1 正在调用它,因此 func1 应该释放该内存。但是我正在将 returned 值分配给 func1 的局部变量 f1 之一,并将 return 该变量分配给主函数 我无法在 func1.

那么,我将如何释放在 func2 中分配的内存。 func1中的f1func2中的f2的堆内存space是否相同?

如果您希望 func1 释放任何东西,它应该调用 free:

char * 
func1(void)
{
    char *f1 = malloc (sizeof *f1 * 10);
    free(f1);
    f1 = func2();
    
    return f1;
}

如果你没有显式释放内存,那么你有内存泄漏,因为用 func2 的结果覆盖 f1 会丢弃 f1 的先前值和你的程序不再知道先前分配的地址的值,因此您将无法释放它。

malloc返回的值之间没有任何关系。考虑:

int x = 5;
x = 7;

5 怎么了?它被丢弃了。 malloc 返回的地址没有什么神奇之处。如果您为 f1 分配不同的值,则先前的值将被丢弃。

当您 malloc 一块内存时,那块内存 会一直保持 直到您在其上显式调用 freemalloc returns 指向该内存块的指针,如果您用指向不同内存块的指针覆盖该指针,它不会删除第一个内存块。您可以像 William Pursell 建议的那样 free func1 中的旧 f1,或者您可以不首先分配第二块内存,因为分配更多未使用的内存没有任何作用:

char* func1() {
    char* f1 = func2();
    return f1;
}

作为旁注,you should never cast the result of malloc.