C-函数,以动态分配的char*的两个维数阵列



所以,这是我的逻辑:

这是一些文字:

char *text;

那么这是文本的数组:

char **arr;

然后这些数组的数组是:

char ***arr2d;

,如果我想修改函数,则需要接受它为:

char ****arr2d;

在功能中使用它为:

*arr2d = (e.g. allocate);

所以,如果我想创建这样的2D数组并制作第一行,第一列仅包含一个字母" a",那么为什么这不起作用?

   #define COLUMNS 7
    void loadTable(char ****table)
    {
            *table = (char ***) malloc(sizeof(char**));
            if (!*table) {
                printf("Allocation error for table rows.");
                return;
            }
            *table[0] = (char**) malloc(COLUMNS * sizeof(char*));
            if (!*table[0]) {
                printf("Allocation error for table columns.");
                return;
            }
            *table[0][0] = (char*) malloc(2 * sizeof(char));
        *table[0][0][0] = (char)(97);
        *table[0][0][1] = '';
    }

    int main()
    {
        char ***table;
        loadTable(&table);
        return 0;
    }

您只需要3 ***即可完成所描述的事情,而不是4 ****。请注意,有一些方法可以让您避免在字符串阵列阵列方面避免过度深度。而且也有充分的理由避免过度深入的数组订单,并不是要free(.)您分配的所有内容。这完全意味着每个呼叫[m][c][re]alloc(.)的呼叫恰好是free(.)

但是要解决您的问题...

通常,要为先前分配的内存的a 单个数组创建新的内存,您可以使用原型的函数为:

char * ReSizeBuffer(char **str, size_t origSize);

如果说先前分配的缓冲区是:

char *buf = calloc(origSize, 1);  

...用法看起来像:

char *tmp = {0};
tmp = ReSizeBuffer(&buf, newSize); //see implementation below
if(!tmp)
{
   free(buf);
   return NULL;
}
buf = tmp;
///use new buf
...

那么,如果这适用于单个char数组,则用于为先前分配的字符串分配新内存的原型,可能看起来像这样:

char ** ReSizeBuffer(char ***str, size_t numArrays, size_t strLens);

如果说先前分配的 2d 缓冲区是:

char **buf = Create2DStr(size_t numStrings, size_t maxStrLen); //see implementation below

...用法看起来像:

char **tmp = {0};
tmp = ReSizeBuffer(&buf, numStrings, maxStrLen);
if(!tmp)
{
   free(buf);
   return NULL;
}
buf = tmp;
///use new buf
...

实现:

ReSizeBuffer的实现。如果您想实现第二个原型:

必须扩展这一点
char * ReSizeBuffer(char **str, size_t size)
{
    char *tmp={0};
    if(!(*str)) return NULL;
    if(size == 0)
    {
        free(*str);
        return NULL;
    }
    tmp = (char *)realloc((char *)(*str), size);
    if(!tmp)
    {
        free(*str);
        return NULL;
    }
    *str = tmp;
    return *str;
}

Create2DStr的实现可能是这样的:

char ** Create2DStr(size_t numStrings, size_t maxStrLen)
{
    int i;
    char **a = {0};
    a = calloc(numStrings, sizeof(char *));
    for(i=0;i<numStrings; i++)
    {
      a[i] = calloc(maxStrLen + 1, 1);
    }
    return a;
}

我只是偶然发现了我的这个旧问题,并立即发现了这个问题。这是答案:

星号的数量实际上是正确的,问题是操作员评估。具体来说,此形式的所有代码行:

*table[0]

应该写为:

(*table)[0]