数组数据类型的内存分配

迈克·M

我一直在教自己如何用C编写代码,并且已经成功编写了一个大小合适的程序。我在编译或执行程序时没有问题,但是我有点担心关于数组数据类型的内存分配的次要细节。

我以以下方式为数组动态分配内存:

double **array=malloc(n*sizeof(*array));
for(i=0; i<n; i++){
    array[i]=malloc(3*sizeof(*(array[i])));
}

这对于构造nx3数组非常有效,对此我感到很高兴。但是,我从先前的许多问答中了解到,您不仅需要释放数组本身,还需要释放数组中的每个元素。为什么我无法释放元素?当我这样做时:

for(i=0; i<n; i++){
    free(array[i]);
}
free(array);

循环导致内存损坏。当我删除循环并简单地释放数组时,没有分段错误或损坏,并且运行平稳。有人可以向我解释一下吗?我不了解在这种情况下释放指针与变量的原理吗?

谢谢,最好的问候,迈克

乔纳森·莱夫勒

这是一个MCVE(如何创建一个最小,完整和可验证的示例?)或SSCCE(简短,自包含,正确的示例)(两个名称和相同思想的链接),它们非常紧密地基于您的代码:

#include <stdlib.h>

int main(void)
{
    int i;
    int n = 20;
    double **array = malloc(n * sizeof(*array));
    for (i = 0; i < n; i++)
    {
        array[i] = malloc(3 * sizeof(*(array[i])));
    }

    for (int x = 0; x < n; x++)
        for (int y = 0; y < 3; y++)
            array[x][y] = 0.0;

    for (i = 0; i < n; i++)
    {
        free(array[i]);
    }
    free(array);
    return 0;
}

在Mac OS X 10.9.5上使用GCC 4.9.1编译并在valgrind3.10.0运行时,它将产生干净的运行状况清单:

==7957== Memcheck, a memory error detector
==7957== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==7957== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
==7957== Command: mma
==7957== 
==7957== 
==7957== HEAP SUMMARY:
==7957==     in use at exit: 25,245 bytes in 373 blocks
==7957==   total heap usage: 470 allocs, 97 frees, 31,829 bytes allocated
==7957== 
==7957== LEAK SUMMARY:
==7957==    definitely lost: 0 bytes in 0 blocks
==7957==    indirectly lost: 0 bytes in 0 blocks
==7957==      possibly lost: 0 bytes in 0 blocks
==7957==    still reachable: 0 bytes in 0 blocks
==7957==         suppressed: 25,245 bytes in 373 blocks
==7957== 
==7957== For counts of detected and suppressed errors, rerun with: -v
==7957== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

(Mac OS X运行时库总是有很多内存分配。)

这强烈表明问题不在于内存分配或释放代码,而在于(错误)使用内存的代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

数组数据类型的内存分配

来自分类Dev

SAS如何为数据类型分配内存

来自分类Dev

新定义数据类型的n个指针的内存分配

来自分类Dev

使用较小的数据类型是否会减少内存使用(从内存分配而不是效率)?

来自分类Dev

使用较小的数据类型是否会减少内存使用(从内存分配而不是效率)?

来自分类Dev

使用对malloc的单次调用为C 89/90中的未知数据类型的2D数组动态分配连续的内存块

来自分类Dev

如何清除内存或改用SageMaker以避免MemoryError:无法为形状(25000,2000)和数据类型float64的数组分配

来自分类Dev

如何为std :: vector <std :: vector <int>>数据类型分配内存?

来自分类Dev

在C中为不同的数据类型分配内存的正确方法是什么?

来自分类Dev

分配很多基本数据类型会导致内存泄漏,你能避免吗?

来自分类Dev

内存如何确定变量的数据类型?

来自分类Dev

枚举数据类型默认编号分配

来自分类Dev

numpy-将列数据类型(dtype)分配给现有数组

来自分类Dev

MemoryError:无法分配形状(118、840983)和数据类型float64的数组

来自分类Dev

为数据类型分配的默认内存是否在舍入中起作用?如果超出分配的内存,浮点数以什么方式四舍五入?

来自分类Dev

在Java中,为什么在数据类型分配内存之前不使用new运算符?

来自分类Dev

将不同的数据类型存储在C中的同一已分配内存中可以吗?

来自分类Dev

Java中的多数据类型数组

来自分类Dev

numpy数据类型导致数组重复

来自分类Dev

SML,递归数据类型数组

来自分类Dev

如何获取数组的数据类型的大小

来自分类Dev

为ASCII数据添加名称并分配数据类型

来自分类Dev

数组:找不到数据类型字符变化的数组类型[]

来自分类Dev

为什么我们不能在内存限制内声明任何大小的数组,比如int数据类型?

来自分类Dev

每个数据类型都在数组中保留一个内存或地址,但为什么逗号(,)不将其内存保留在数组中

来自分类Dev

常量数据类型不能分配为非常量数据类型

来自分类Dev

MemoryError:无法为形状(1122、1122、12288)和数据类型float64的数组分配115。GiB

来自分类Dev

MemoryError:无法为形状为(287318,3704243)和数据类型float64的数组分配7.74 TiB

来自分类Dev

MemoryError:无法为形状(725000、277、76)和数据类型float64的数组分配30.4 GiB

Related 相关文章

  1. 1

    数组数据类型的内存分配

  2. 2

    SAS如何为数据类型分配内存

  3. 3

    新定义数据类型的n个指针的内存分配

  4. 4

    使用较小的数据类型是否会减少内存使用(从内存分配而不是效率)?

  5. 5

    使用较小的数据类型是否会减少内存使用(从内存分配而不是效率)?

  6. 6

    使用对malloc的单次调用为C 89/90中的未知数据类型的2D数组动态分配连续的内存块

  7. 7

    如何清除内存或改用SageMaker以避免MemoryError:无法为形状(25000,2000)和数据类型float64的数组分配

  8. 8

    如何为std :: vector <std :: vector <int>>数据类型分配内存?

  9. 9

    在C中为不同的数据类型分配内存的正确方法是什么?

  10. 10

    分配很多基本数据类型会导致内存泄漏,你能避免吗?

  11. 11

    内存如何确定变量的数据类型?

  12. 12

    枚举数据类型默认编号分配

  13. 13

    numpy-将列数据类型(dtype)分配给现有数组

  14. 14

    MemoryError:无法分配形状(118、840983)和数据类型float64的数组

  15. 15

    为数据类型分配的默认内存是否在舍入中起作用?如果超出分配的内存,浮点数以什么方式四舍五入?

  16. 16

    在Java中,为什么在数据类型分配内存之前不使用new运算符?

  17. 17

    将不同的数据类型存储在C中的同一已分配内存中可以吗?

  18. 18

    Java中的多数据类型数组

  19. 19

    numpy数据类型导致数组重复

  20. 20

    SML,递归数据类型数组

  21. 21

    如何获取数组的数据类型的大小

  22. 22

    为ASCII数据添加名称并分配数据类型

  23. 23

    数组:找不到数据类型字符变化的数组类型[]

  24. 24

    为什么我们不能在内存限制内声明任何大小的数组,比如int数据类型?

  25. 25

    每个数据类型都在数组中保留一个内存或地址,但为什么逗号(,)不将其内存保留在数组中

  26. 26

    常量数据类型不能分配为非常量数据类型

  27. 27

    MemoryError:无法为形状(1122、1122、12288)和数据类型float64的数组分配115。GiB

  28. 28

    MemoryError:无法为形状为(287318,3704243)和数据类型float64的数组分配7.74 TiB

  29. 29

    MemoryError:无法为形状(725000、277、76)和数据类型float64的数组分配30.4 GiB

热门标签

归档