设置2D阵列,稍后更改大小 - C.

时间:2014-09-22 23:40:23

标签: c arrays multidimensional-array

是否可以在C中声​​明2D数组,然后稍后设置其大小?我知道在C中你必须处理记忆等问题,但是尽管我都在搜索,但我找不到这个问题的答案。

我目前的例子是..

   int boardsize, linewin;
   char array[1][1];
   //boardsize is set within here.

   array = [boardsize][boardsize];

1 个答案:

答案 0 :(得分:2)

使用C语言,您需要使用指针进行自己的动态数组管理。

请参阅以下文章,了解如何使用分配的内存区域进行此操作。

Malloc a 2D array in C

Using malloc for allocation of multi-dimensional arrays with different row lengths

由于您要修改这些,您可能还需要使用realloc()函数或free()函数来释放已分配的内存。

有关使用realloc()函数的信息,请查看以下堆栈溢出。

Realloc double 2D array in C

two-dimensional dynamic array (realloc in c)

编辑 - 添加示例

以下是malloc()二维数组和realloc()二维数组的两个函数。如果将NULL指针传递给realloc()以便重新分配内存区域,实际上可以使用realloc2dCArray()版本。

我尝试做的是为所需的所有内存使用单个malloc()realloc(),这样您只需调用{{1}即可free()内存}}

free()

要使用这些功能,您可以执行以下操作:

char **malloc2dCArray (int nRows, int nCols)
{
    // use a single malloc for the char pointers to the first char of each row
    // so we allocate space for the pointers and then space for the actual rows.
    char **pArray = malloc (sizeof(char *) * nRows + sizeof(char) * nCols * nRows);

    if (pArray) {
        // calculate offset to the beginning of the actual data space
        char *pOffset = (char *)(pArray + nRows);
        int   i;

        // fix up the pointers to the individual rows
        for (i = 0; i < nRows; i++) {
            pArray[i] = pOffset;
            pOffset += nCols;
        }
    }

    return pArray;
}

char **realloc2dCArray (char **pOld, int nRows, int nCols)
{
    // use a single realloc for the char pointers to the first char of each row
    // so we reallocate space for the pointers and then space for the actual rows.
    char **pArray = realloc (pOld, sizeof(char *) * nRows + sizeof(char) * nCols * nRows);

    if (pArray) {
        // calculate offset to the beginning of the actual data space
        char *pOffset = (char *)(pArray + nRows);
        int   i;

        // fix up the pointers to the individual rows
        for (i = 0; i < nRows; i++) {
            pArray[i] = pOffset;
            pOffset += nCols;
        }
    }

    return pArray;
}

要执行char **pChars = malloc2dCArray (16, 8); int i, j; for (i = 0; i < 16; i++) { for (j = 0; j < 8; j++) { pChars[i][j] = 0; } } ,您需要检查realloc()是否有效,因此请使用临时变量并在使用前检查NULL。

realloc()

如果提供NULL指针,也可以使用{ char **pChars2 = realloc2dCArray (pChars, 25, 8); if (pChars2) pChars = pChars2; } 版本,因为如果指向realloc()的内存的指针为NULL,realloc()将执行malloc()

我使用调试器对此进行了一些测试,看起来它对我有用。