C:当不再有指向结构的指针时,如何释放内存?

Pit*_*kos 2 c malloc free struct function

我有一个函数可以创建一个结构并返回新结构本身。该结构包含一个数字数组和一个显示有多少个数字的整数(这就像一个数组)。所以我有 makeStruct 来创建一个临时结构然后返回它。在 main 中,我调用此函数并将其分配给我的结构 myNumbers。其效果是,在函数中创建了一个结构实例,将其复制到 myNumbers,然后将其删除。我的假设正确吗?

这似乎编译正确,但我看不到释放分配的内存的方法,因为没有指针指向我的结构。我怎样才能释放内存?

#include <stdlib.h>
#include <stdio.h>

typedef struct{
    int* numbers; /*array of numbers*/
    int  crowd; /*crowd of numbers*/
} magicNums;

magicNums makeStruct(int crowd){
    magicNums tempStruct, *struct_ptr=&tempStruct; /*my temp struct and its pointer*/
    struct_ptr=(magicNums*)malloc(sizeof(magicNums)); /*allocating memory for struct*/
    tempStruct.numbers=(int*)malloc(sizeof(int)*crowd); /*allocating memory for struct's numbers*/
    return tempStruct;
}

int main() {
    magicNums myNumbers;
    myNumbers=makeStruct(10);
    /*magicNums *myNumbers_ptr=&myNumbers;  This won't work             */
    /*free(myNumbers_ptr);                  This won't work             */
    /*free(&myNumbers);                     This won't work             */
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

nos*_*nos 5

至于回答你的问题,“当不再有指向它的指针时,如何释放内存以进行结构?”。

你不能。您的代码泄漏了内存。

然而你的代码中有很多毫无意义的错误

 magicNums tempStruct, *struct_ptr=&tempStruct;
 struct_ptr=(magicNums*)malloc(sizeof(magicNums)); 
Run Code Online (Sandbox Code Playgroud)

上面两行首先设置struct_ptr = &tempStruct; ,然后用 malloc 的返回值替换该指针。这两行的作用与以下完全相同:

 magicNums tempStruct;
 magicNums *struct_ptr;
 struct_ptr=(magicNums*)malloc(sizeof(magicNums)); 
Run Code Online (Sandbox Code Playgroud)

这可能会让人们更清楚地了解正在发生的事情。

返回临时结构;

通过在此处返回 tempStruct,您将丢失指向 struct_ptr 的指针,因此您无法释放它,并且会泄漏内存。

不过,您并没有丢失指向 tempStruct.numbers 的指针。您可以在 main 中释放它:

magicNums myNumbers;
myNumbers=makeStruct(10);
free(myNumbers.numbers);
Run Code Online (Sandbox Code Playgroud)

magicNums 不是指针,您不能也不需要释放它。您按值返回一个结构,所以没关系 - 那里不涉及动态内存。