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