【问题标题】:Freeing dynamically allocated 2D array in C在 C 中释放动态分配的二维数组
【发布时间】:2018-09-01 02:21:05
【问题描述】:

我有这个代码段:

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

int main()
{
    int ** ar;
    int i;
    ar = malloc( 2 * sizeof(int*));

    for(i=0; i<2; i++)
        ar[i] = malloc ( 3 * sizeof(int) );

    ar[0][0]=1;
    ar[0][1]=2;
    ar[0][2]=5;
    ar[1][0]=3;
    ar[1][1]=4;
    ar[1][2]=6;

    for(i=0; i<2; i++)
        free(ar[i]);

    free(ar);
    printf("%d" , ar[1][2]);

    return 0;
}

我浏览了一些关于这个主题的主题 (how to free c 2d array) 但他们已经很老了,没有人活跃。

我对代码有以下疑问:

  1. 这是为 C 中的二维数组释放内存的正确方法吗?

  2. 如果这是正确的方法,那么为什么我在尝试打印时仍然得到相应的数组值?这是否意味着内存没有被正确释放?

  3. 内存释放后会发生什么情况?我存储的所有值是否都被删除了,或者它们只是留在等待重新分配的内存中?

  4. 这是预期的未定义行为吗?

【问题讨论】:

  • 这不是一个二维数组,而是一个指针数组。 C 有名副其实的二维数组。它们通过一次调用malloc 被分配,一次调用free 被释放。使用它们。
  • @JensGustedt 你的意思是我一次性分配内存并使用指针算法访问值的那些数组吗?
  • 格式/缩进错误。
  • 释放后访问内容是未定义的行为。 UB 不保证任何特定的故障模式(这就是它被称为“未定义”的原因)。

标签: c heap-memory dynamic-allocation


【解决方案1】:

是的,您有两个级别或层(可以这么说)要释放的内存。

内部内存分配(我喜欢你首先这样做的方式)

最顶层的 int** 指针的外部内存分配。

即使你释放了内存,也没有做任何事情来覆盖它(所以是的,这是意料之中的)。因此,您仍然可以将它们打印到控制台。用完指针后总是将指针设为 NULL 是个好主意。有点礼貌的做法。我过去修复了许多错误和崩溃,因为代码在释放指针后没有使指针为空。

在 Microsoft 的 Visual Studio 中,使用 Debug C 运行时,它可以用一些垃圾覆盖新释放的值,如果使用或取消引用,这些垃圾会立即引发访问冲突。这对于清除错误很有用。

看起来你是 C 的新手(学生?)。欢迎您,享受愉快的时光。

【讨论】:

  • 如果我在 Visual Studio 中做同样的事情,我会得到类似分段错误的东西?
猜你喜欢
  • 1970-01-01
  • 2022-01-15
  • 2016-02-16
  • 2013-11-14
  • 2021-02-03
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多