是否可以在C中声明2D数组,然后稍后设置其大小?我知道在C中你必须处理记忆等问题,但是尽管我都在搜索,但我找不到这个问题的答案。
我目前的例子是..
int boardsize, linewin;
char array[1][1];
//boardsize is set within here.
array = [boardsize][boardsize];
答案 0 :(得分:2)
使用C语言,您需要使用指针进行自己的动态数组管理。
请参阅以下文章,了解如何使用分配的内存区域进行此操作。
Using malloc for allocation of multi-dimensional arrays with different row lengths
由于您要修改这些,您可能还需要使用realloc()
函数或free()
函数来释放已分配的内存。
有关使用realloc()函数的信息,请查看以下堆栈溢出。
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()
。
我使用调试器对此进行了一些测试,看起来它对我有用。