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)
至于回答你的问题,“当不再有指向它的指针时,如何释放内存以进行结构?”。
你不能。您的代码泄漏了内存。
然而你的代码中有很多毫无意义的错误
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 不是指针,您不能也不需要释放它。您按值返回一个结构,所以没关系 - 那里不涉及动态内存。
归档时间: |
|
查看次数: |
5313 次 |
最近记录: |