我想在循环中创建结构并将它们传递给函数foo
。然后该函数应该处理结构数据并将结构保存在数组中以备后用。如何使用正确的内存管理将动态创建的结构保存在数组中?
// create structs in a loop
for(int i=0; i<1000); i++) {
my_struct* s = (my_struct*) malloc(sizeof(my_struct));
s->memb1 = "foo"; // this data will change in each iteration
s->memb2 = "bar"; // only for simplicity here
store_in_array(s);
}
// ...
my_struct* global_array = (my_struct*) malloc(size * sizeof(my_struct));
int foo(my_struct* s) {
// process s in some way
// ...
// store s it for later use in array
global_array[index] = s; // boom
}
显然存储的这种方式是不可能的,因为我不能保存指针
s
在数组中。但是,我不知道该怎么做。它是如何工作的?循环将在下一次迭代中覆盖s指针。我不希望
global_array
中的数据发生变化。我怎样才能做到这一点?我需要在foo
中创建s
的深层副本吗?后来我不会使用
global_array
,我想释放内存。只需简单地拨打free(global_array)
即可释放实际内容,即事先存储在其中的所有结构。
在下一次循环迭代中覆盖指针时没有问题吗?分配的内存仍然存在,但没有内存泄漏,因为我将指针保存在数组中。它是否正确? – null
正确。您将指针值传递给将其保存在全局数组中的函数,因此不会泄漏。只要你最终释放全球名单,你就没事。 – dbush
@null - 另请注意,此解决方案仅适用于阵列中固定数量的“大小”条目。所以你或者需要确保'index'永远不会超过数组的末尾--OR--当它发生时使用'realloc'来增长你的数组。 –