c - 使用 free() 释放内存不起作用

标签 c pointers malloc free

这是一个小程序,它填充一些数组并将其内容打印在屏幕上:

#include <stdlib.h>
#include <stdio.h>

typedef struct{
    double **plist;
    int plistSize;
} ParticleList;

void sendPar(int *n, int np){
    // allocate memory for struct pl
    ParticleList pl;

    // allocate memory  for ParticleList np times
    pl.plist = malloc(sizeof(ParticleList) * np);

    // allocate memory for lists of size n[k]
    for(int k=0; k<np; k++){
        pl.plist[k] = malloc(sizeof(double) * n[k]);
    }

    // write some data to the list
    for(int k=0; k<np; k++){
        for(int l=0; l<n[k]; l++){
            pl.plist[k][l] = 100000*k+100*l;
        }
        pl.plistSize = n[k];
    }

    // print data to check
    for(int k=0; k<np; k++){
        printf("Listsize: %d\n", n[k]);
        for(int l=0; l<n[k]; l++){
            printf("Processor %d, Entry %d, Value %lf\n", k, l, pl.plist[k][l]);
        }
    }

    free(pl.plist);
}

int main(){
    int np = 3;

    int n[np];
    n[0] = 2;
    n[1] = 4;
    n[2] = 7;

    sendPar(n, np);
}

这是输出:

Listsize: 2
Processor 0, Entry 0, Value 0.000000
Processor 0, Entry 1, Value 100.000000
Listsize: 4
Processor 1, Entry 0, Value 100000.000000
Processor 1, Entry 1, Value 100100.000000
Processor 1, Entry 2, Value 100200.000000
Processor 1, Entry 3, Value 100300.000000
Listsize: 7
Processor 2, Entry 0, Value 200000.000000
Processor 2, Entry 1, Value 200100.000000
Processor 2, Entry 2, Value 200200.000000
Processor 2, Entry 3, Value 200300.000000
Processor 2, Entry 4, Value 200400.000000
Processor 2, Entry 5, Value 200500.000000

如果我现在想释放内存,请使用 free(pl)不起作用。我也尝试过free(pl.plist)这确实有效。但我还记得plistSize没有被释放。释放内存的正确方法是什么?

最佳答案

本次内存分配

pl.plist = malloc(sizeof(ParticleList) * np);
                  ^^^^^^^^^^^^^^^^^^^

没有意义。我想你的意思是

pl.plist = malloc( sizeof( double * ) * np);
                  ^^^^^^^^^^^^^^^^

此循环中的最后一条语句

// write some data to the list
for(int k=0; k<np; k++){
    for(int l=0; l<n[k]; l++){
        pl.plist[k][l] = 100000*k+100*l;
    }
    pl.plistSize = n[k];
    ^^^^^^^^^^^^^^^^^^^^
}

也没有意义,因为标量对象pl.plistSize在外循环的每次迭代中都会被覆盖。

要释放分配的内存,您可以编写

for(int k=0; k<np; k++){
    free( pl.plist[k] )
}

free( pl.plist );

关于c - 使用 free() 释放内存不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41678680/

相关文章:

c - 向结构添加元素时出现段错误

c++ - 尝试 push_back 到 std::vector 时出现段错误

c++ - _CRTDBG_MAP_ALLOC 根本没有输出

c - 什么构成了C中常量表达式的细节?

c - 将魔术字节写入堆栈以监控其使用情况

c++ - 复制抽象基类的对象

c - 在取消引用之前为未初始化的指针赋值

c - 如何将值0x00放入c中动态分配的char *数组?

c - C 中二维变长数组的结构

c - 我们如何在 LLVM 中提取指针类型