所以,这是我的逻辑:
这是一些文字:
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;
}
答案 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]