我应该在C中的2D数组的malloc和calloc之后检查NULL指针吗?
好的,我承认我应该在mallocing时检查空指针,但是calloc呢?是否存在可能的内存泄漏我应该在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,
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*
。