我应该在C中的2D数组的malloc和calloc之后检查NULL指针吗?

我应该在C中的2D数组的malloc和calloc之后检查NULL指针吗?,c,multidimensional-array,memory-leaks,calloc,null-pointer,C,Multidimensional Array,Memory Leaks,Calloc,Null Pointer,好的,我承认我应该在mallocing时检查空指针,但是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,

好的,我承认我应该在mallocing时检查空指针,但是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);
}
int**initializeMatrix(int*行,int*列){
int**matrix=malloc((*行)*sizeof(int*);
校验空指针(矩阵);
对于(int i=0;i<*行;i++){
矩阵[i]=calloc(*cols,sizeof(int));
}
收益矩阵;
}
无效检查空指针(int**ptr){
如果(ptr==NULL)
printErrorMessage(memoryErrorMessage,101);
}

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


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

我认为您不理解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时完全相同。

您认为calloc有什么不同?没有人谈论它。调用内存时,它被设置为某个值,而当调用内存时,它被保留以供使用,不是吗?检查
malloc
和相关的返回值与内存泄漏无关。您检查它返回的指针,看看操作是否成功。@P\U J\uu:U wot<代码>自由(NULL)自ANSI C以来被定义为无操作。请注意,您没有分配二维数组。将指针数组分配给多个完全独立的一维数组。这是一种非常低效的内存分配方式,特别是对于二维以上的“数组”。在每一次迭代中,我都应该检查空指针(矩阵[I]),对吗?@tomashauser:好吧,你需要一个具有适当指针类型的版本:你的指针将是
int*
类型,不过老实说你可以用
void*
重写它,这样你就可以在两种情况下都使用它了。哦,我明白了。我想我会做
if(matrix[I]==NULL){…}
@tomashauser:No,
free
隐式地包含
if
语句。你这是什么意思<代码>矩阵[i]现在是一个指针,我正在检查它是否为空。接下来我将释放除此指针以外的所有内容。我还没有听说过memset。我只是认为calloc将执行malloc并在指定的内存空间中分配零。但是我不知道空指针检查是因为分配内存失败,调用时也可能发生这种情况。很明显,我在学习C,有些东西我在任何地方都找不到,也无法自己推断,所以我在这里问。这不像是问calloc是如何工作的。这是我偶然发现的一个具体问题。
mycalloc
的返回类型中有一个输入错误。显然,它应该返回
void*