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_initmem_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 $