【问题标题】:Should I check for NULL pointer after malloc and calloc of 2D array in C?我应该在 C 中二维数组的 malloc 和 calloc 之后检查 NULL 指针吗?
【发布时间】:2019-11-25 18:02:27
【问题描述】:

好的,我承认我应该在 malloc 时检查 NULL 指针,但是 calloc 呢?是否可能存在内存泄漏?

int **initializeMatrix(int *rows, int *cols) {
    int **matrix = malloc((*rows) * sizeof(int*));
    checkNullPointer(matrix);
    for(int i = 0; i < *rows; i++) {
        matrix[i] = calloc(*cols, sizeof(int));
    }

    return matrix;
}

void checkNullPointer(int **ptr) {
    if (ptr == NULL)
        printErrorMessage(memoryErrorMessage, 101);
}

【问题讨论】:

  • 为什么你认为它与 calloc 不同?
  • 没有人谈论它。当你调用内存时,它被设置为某个值,而当你分配内存时,内存被保留以供使用不是吗?
  • 检查malloc的返回值及相关与内存泄漏无关。您检查它返回的指针以查看操作是否成功。
  • @P__J__:你什么? free(NULL) 自 ANSI C 以来已被定义为无操作。
  • 请注意,您没有分配二维数组。您正在将一个指针数组分配给多个完全独立的一维数组。这是一种非常低效的内存分配方式,尤其是对于二维以上的“数组”。见stackoverflow.com/questions/42094465/…

标签: c multidimensional-array memory-leaks calloc null-pointer


【解决方案1】:

您确实需要检查calloc 的返回值(如果无法分配内存,它将是NULL),但请注意,在NULL 指针上调用free 是无操作的,因此本身不会立即发生内存泄漏。

当然,在遇到NULL 返回后进行清理时,您需要对来自成功的calloc 调用的所有非NULL 指针调用free。就我个人而言,我也会在行分配上调用calloc,以简化该过程。

【讨论】:

  • 所以在每次迭代中,我都应该做checkNullPointer(matrix[i]);,对吗?
  • @tomashauser:嗯,你需要一个具有适当指针类型的版本:你的指针将是一个int * 类型,虽然老实说你可以用void* 重写它,所以你可以在这两种情况下使用它。
  • 哦,我明白了。我想我会做if (matrix[i] == NULL) {...}
  • @tomashauser:不,free 隐含包含 if 语句。
  • 你这是什么意思? matrix[i] 现在是一个指针,我正在检查它是否为 NULL。接下来我将释放除此指针之外的所有内容。
【解决方案2】:

我想你不明白 calloc 是什么。

逻辑等价物:

void *mycalloc(size_t num, size_t size)
{
    size_t total = size * num;
    void *ptr = malloc(total);
    if(ptr)
    {
        memset(ptr, 0, total);
    }
    return ptr;
}

您需要检查内存的分配方式是否与使用 malloc 时完全相同。

【讨论】:

  • 我没听说过 memset。我只是认为 calloc 会做 malloc 并在指定的内存空间中分配零。但我不知道 NULL 指针检查是因为未能分配内存,这在调用时也可能发生。
  • 好吧,我显然正在学习 C,有些东西我在任何地方都找不到或自己推断,所以我在这里问。这不像问 calloc 是如何工作的。这是我偶然发现的一个具体问题。
  • mycalloc 的返回类型有错别字。显然,它应该返回void *
猜你喜欢
  • 2011-02-19
  • 2014-11-13
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 2019-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多