用于检查 C 中多维数组所有维度的内存分配的函数

A function for checking memory allocation for all dimensions of a multidimensional array in C

代码如下:

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

#define numOfStrings 10
#define sizeOfString 30

void crashControl();
int main()
{
    char **strArray = (char **)malloc(numOfStrings*sizeof(char *));
    crashControl(strArray);

    for (int i = 0; i < numOfStrings; i++)
    {
        strArray[i] = (char *)malloc(sizeOfString*sizeof(char));
        crashControl(strArray[i]);
    }

    return 0;
}

void crashControl(char *A)
{
    if (!A)
    {
        printf("Not enough space.\n");
        exit(1);
    }
}

它似乎工作正常。当我增加 numOfStrings 太多时 crashControl(strArray) 工作正常。同样,当我增加 sizeofString 太多时,crashControl(strArray[i]) 也能正常工作。但我想知道,我这样做是对还是错?此代码是否存在风险或错误? crashControl()函数的参数是一维数组,我可以随意对任何N维数组使用这个函数吗?

是的,您可以将它用于多维数组。但是,在这种情况下重写它可能会很好。不要将 char * 作为参数,而应将 void * 设为通用参数。

你的函数测试的基本上就是指针是否为空指针。仅此而已。我会说它的设计非常糟糕,因为该功能给人的印象是它做得更多。我看不出有任何理由在单独的函数中进行空检查。最好在 malloc 之后立即进行检查,如下所示:

char **strArray = (char **)malloc(numOfStrings*sizeof(char *));
if(!strArray) {
    printf("Error allocating memory\n");
    exit(1);
}

如果你真的想在一个函数中做这个检查,我建议将它命名为 isNull 并这样写:

int isNull(void * ptr) 
{
    if(ptr)
        return 0;
    else
        return 1;
}

但是由于这个函数总是在 if 语句中被调用,所以这是毫无意义的。