修改动态分配的二维char *数组的函数

时间:2017-05-05 17:01:51

标签: c arrays multidimensional-array char malloc

所以,这是我的逻辑:

这是一些文字:

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] = '\0';
    }


    int main()
    {

        char ***table;

        loadTable(&table);

        return 0;
    }

2 个答案:

答案 0 :(得分:2)

您只需要3 ***来执行您描述的操作,而不是4 ****。请注意,有一些方法可以避免在字符串数组数组方面过度深度。并且有充分的理由避免过多的数组命令,不仅仅是需要free(.)你分配的所有内容。这意味着,对free(.)的每次调用只需拨打[m][c][re]alloc(.)一次。

但要解决你的问题......

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

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;
}

答案 1 :(得分:0)

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

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

*table[0]

应该写为:

(*table)[0]