C内存分配
C memory allocationd
void mem_init(int n) {
struct A{
int thing1;
double thing2;
};
arr_A= malloc(sizeof(struct A)*n);
for(int i=0; i<n; i++){
arr_A[i] = malloc(sizeof(struct A));
arr_A[i]->thing1 =1;
arr_A[i]->thing2 =2;
}
}
void mem_free() {
free(A);
}
我只是将结构数组设置为全局变量并解决了这个问题。
非常感谢。
你的函数没有工作,因为你没有将数组传递给自由函数。你需要把你的功能改成这样,
void mem_free(struct A * ptr_to_mem) {
free(ptr_to_mem);
}
I want to have a array of struct A, so I declared the array in function 'mem_init'.
这不是您所做的,因为 struct A *arr_A[n];
是 指针的数组 到 struct A
.
一个struct A
的数组可以是
struct A arr_A[n]; // variable length array
或
struct A * arr_A = malloc(n * sizeof(struct A));
当然有一个 struct A 的数组,而不是修改指向循环的指针:
for(int i=0; i<n; i++){
arr_A[i].thing1 =1;
arr_A[i].thing2 =2;
}
now I want to make a function to free the memory of 'arr_A'
if arr_A 是你可以做的指针数组(假设 A 的定义已知 mem_init) :
void mem_free(struct A ** arr_A, int n)
{
for(int i=0; i<n; i++)
free(arr_A[i]);
}
else(这个函数其实没什么用,free可以直接使用而不是自己定义调用mem_free ) :
void mem_free(struct A *arr_A)
{
free(arr_A);
}
除此之外,目前 mem_free 的调用只能在 mem_init 中完成,因为只有它知道阵列,你真的想要那个吗?如果不是 mem_init 可以 return 数组的地址,使用你的指针数组一个解决方案是:
#include <stdlib.h>
struct A {
int thing1;
double thing2;
};
struct A ** mem_init(int n) {
struct A ** arr_A = malloc(n * sizeof(struct A *));
for(int i=0; i<n; i++){
arr_A[i] = malloc(sizeof(struct A));
arr_A[i]->thing1 =1;
arr_A[i]->thing2 =2;
}
return arr_A;
}
void mem_free(struct A ** arr_A, int n)
{
for(int i=0; i<n; i++)
free(arr_A[i]);
free(arr_A);
}
int main()
{
const int nelt = 10;
struct A ** arr_A = mem_init(nelt);
mem_free(arr_A, nelt);
return 0;
}
注意我把A的定义移到了外面,数组不再是本地VLA到mem_init到mem_init
执行后即可使用
编译执行:
pi@raspberrypi:/tmp $ gcc -Wall c.c
pi@raspberrypi:/tmp $ ./a.out
pi@raspberrypi:/tmp $ valgrind ./a.out
==12721== Memcheck, a memory error detector
==12721== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==12721== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==12721== Command: ./a.out
==12721==
==12721==
==12721== HEAP SUMMARY:
==12721== in use at exit: 0 bytes in 0 blocks
==12721== total heap usage: 11 allocs, 11 frees, 200 bytes allocated
==12721==
==12721== All heap blocks were freed -- no leaks are possible
==12721==
==12721== For lists of detected and suppressed errors, rerun with: -s
==12721== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
pi@raspberrypi:/tmp $
void mem_init(int n) {
struct A{
int thing1;
double thing2;
};
arr_A= malloc(sizeof(struct A)*n);
for(int i=0; i<n; i++){
arr_A[i] = malloc(sizeof(struct A));
arr_A[i]->thing1 =1;
arr_A[i]->thing2 =2;
}
}
void mem_free() {
free(A);
}
我只是将结构数组设置为全局变量并解决了这个问题。 非常感谢。
你的函数没有工作,因为你没有将数组传递给自由函数。你需要把你的功能改成这样,
void mem_free(struct A * ptr_to_mem) {
free(ptr_to_mem);
}
I want to have a array of struct A, so I declared the array in function 'mem_init'.
这不是您所做的,因为 struct A *arr_A[n];
是 指针的数组 到 struct A
.
一个struct A
的数组可以是
struct A arr_A[n]; // variable length array
或
struct A * arr_A = malloc(n * sizeof(struct A));
当然有一个 struct A 的数组,而不是修改指向循环的指针:
for(int i=0; i<n; i++){
arr_A[i].thing1 =1;
arr_A[i].thing2 =2;
}
now I want to make a function to free the memory of 'arr_A'
if arr_A 是你可以做的指针数组(假设 A 的定义已知 mem_init) :
void mem_free(struct A ** arr_A, int n)
{
for(int i=0; i<n; i++)
free(arr_A[i]);
}
else(这个函数其实没什么用,free可以直接使用而不是自己定义调用mem_free ) :
void mem_free(struct A *arr_A)
{
free(arr_A);
}
除此之外,目前 mem_free 的调用只能在 mem_init 中完成,因为只有它知道阵列,你真的想要那个吗?如果不是 mem_init 可以 return 数组的地址,使用你的指针数组一个解决方案是:
#include <stdlib.h>
struct A {
int thing1;
double thing2;
};
struct A ** mem_init(int n) {
struct A ** arr_A = malloc(n * sizeof(struct A *));
for(int i=0; i<n; i++){
arr_A[i] = malloc(sizeof(struct A));
arr_A[i]->thing1 =1;
arr_A[i]->thing2 =2;
}
return arr_A;
}
void mem_free(struct A ** arr_A, int n)
{
for(int i=0; i<n; i++)
free(arr_A[i]);
free(arr_A);
}
int main()
{
const int nelt = 10;
struct A ** arr_A = mem_init(nelt);
mem_free(arr_A, nelt);
return 0;
}
注意我把A的定义移到了外面,数组不再是本地VLA到mem_init到mem_init
执行后即可使用编译执行:
pi@raspberrypi:/tmp $ gcc -Wall c.c
pi@raspberrypi:/tmp $ ./a.out
pi@raspberrypi:/tmp $ valgrind ./a.out
==12721== Memcheck, a memory error detector
==12721== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==12721== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==12721== Command: ./a.out
==12721==
==12721==
==12721== HEAP SUMMARY:
==12721== in use at exit: 0 bytes in 0 blocks
==12721== total heap usage: 11 allocs, 11 frees, 200 bytes allocated
==12721==
==12721== All heap blocks were freed -- no leaks are possible
==12721==
==12721== For lists of detected and suppressed errors, rerun with: -s
==12721== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
pi@raspberrypi:/tmp $