我有一个函数,它创建一个结构并返回新结构本身。该结构包含一个数字数组和一个显示有多少数字的整数(这就像一个数组)。 所以我有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;
}
答案 0 :(得分:4)
至于回答你的问题,“如何在没有指针的情况下释放内存以构建它?”。
你做不到。你的代码泄漏了内存。
然而,您的代码中存在许多错误
magicNums tempStruct, *struct_ptr=&tempStruct;
struct_ptr=(magicNums*)malloc(sizeof(magicNums));
以上两行首先设置struct_ptr =&amp; tempStruct; ,稍后用malloc的返回替换该指针。这两行完全相同:
magicNums tempStruct;
magicNums *struct_ptr;
struct_ptr=(magicNums*)malloc(sizeof(magicNums));
这可能会更明确地说明发生了什么。
返回tempStruct;
通过在这里返回tempStruct,你已经丢失了指向struct_ptr的指针,因此你无法释放它,并且你会泄漏内存。
但是你没有丢失指向tempStruct.numbers的指针。您可以在主页中释放它:
magicNums myNumbers;
myNumbers=makeStruct(10);
free(myNumbers.numbers);
magicNums不是指针,你不能也不需要释放它。你按值返回一个结构,所以没关系 - 那里没有动态内存。
答案 1 :(得分:2)
这是正确的,你无法释放内存,因为你没有有效的指针。您已成功创建内存泄漏。
您需要从该函数返回结构指针,而不是按值返回结构。
为什么你首先使用malloc()呢?
答案 2 :(得分:1)
尝试返回指针。
magicNums* makeStruct(int crowd){
magicNums *tempStruct = (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);
free(myNumbers->numbers);
free(myNumbers);
return 0;
}
答案 3 :(得分:1)
这里有很多问题。首先,回答这个问题 - 你做不到。但是,这不是你的问题:
我猜你想要这个:
magicNums* makeStruct(int crowd){
magicNums *struct_ptr =
(magicNums*)malloc(sizeof(magicNums)); /*allocating memory for struct*/
struct_ptr->crowd = crowd;
struct_ptr->numbers=(int*)malloc(sizeof(int)*crowd); /*allocating memory for struct's numbers*/
return struct_ptr;
}
然后主要是
int main() {
magicNums *myNumbers;
myNumbers = makeStruct(10);
free (myNumbers->numbers);
free (myNumbers);
return 0;
}
答案 4 :(得分:1)
您不需要为结构本身分配内存,您的makeStruct应如下所示:
magicNums makeStruct(int crowd) {
magicNums tempStruct;
tempStruct.numbers = (int *) malloc(sizeof(int) * crowd);
tempStruct.crowd = crowd;
return tempStruct;
}
尽管tempStruct是在堆栈上创建的,并在函数返回时自动释放,但该函数将复制tempStruct并返回该值。
然后你可以像这样使用它:
int main() {
magicNums myNumbers;
myNumbers = makeStruct(10);
free(myNumbers.numbers);
}
答案 5 :(得分:0)
如何在没有时释放内存 有一个指向它的指针?
祝你好运!如果你不知道它在哪里,你怎么能希望释放它?解决方案:记住你把它放在哪里!
答案 6 :(得分:0)
据我所见,您只需要malloc
内的第一个makeStruct
。
然后在int main(void)
(!)中稍后你可以
free(myNumbers.numbers);
答案 7 :(得分:0)
您可以在函数本身进行清理,同时将结构的副本返回到主程序。然后您将获得该副本的引用,并且可以在使用后释放它以回收内存。
编辑:请参阅Martins的答案,这可能正是您想要的:)
答案 8 :(得分:0)
以下代码与您对自己所做行为的描述相符。这是否是你想做的,我不知道。
#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;
tempStruct.crowd = crowd;
tempStruct.numbers = malloc(sizeof(*tempStruct.numbers)*crowd);
return tempStruct;
}
int main(void) {
magicNums myNumbers = makeStruct(10);
free(myNumbers.numbers);
return 0;
}