为动态分配一个二维数组:
```c
int **arr;
int rows = 5, cols = 10;
arr = malloc(rows * sizeof(int *));
for (int i = 0; i < rows; i++) {
arr[i] = malloc(cols * sizeof(int));
}
```
char **p;
int i, dim1, dim2;
p = malloc (sizeof (char *) * dim1);
for (i = 0; i < dim1; i++)
{
*(p + i) = malloc (sizeof (char) * dim2);
}
for (i = 0; i < dim1; i++)
{
free (p[i]);
}
free (p);
修改上面的方法。当需要添加另一行时,请执行*(p + i) = malloc (sizeof (char) * dim2);
并更新i
。在这种情况下,您需要预测文件中最大行数,该行数由变量dim1
指示,我们首次分配p
数组。这只会分配(sizeof(int *)*dim1)
字节,因此比char p[dim1][dim2]更好。
我认为还有另一种方法。按块分配数组,并在溢出时链接它们。
struct _lines {
char **line;
int n;
struct _lines *next;
} *file;
file = malloc (sizeof (struct _lines));
file->line = malloc (sizeof (char *) * LINE_MAX);
file->n = 0;
head = file;
完成此操作后,第一个块已准备好使用。当您需要插入一行时,请执行以下操作:
/* get line into buffer */
file.line[n] = malloc (sizeof (char) * (strlen (buffer) + 1));
n++;
当 n
等于 LINE_MAX
时,分配另一个块并将其链接到此块。
struct _lines *temp;
temp = malloc (sizeof (struct _lines));
temp->line = malloc (sizeof (char *) * LINE_MAX);
temp->n = 0;
file->next = temp;
file = file->next;
类似这样。
当一个块的 n
变成 0
后,释放它,并将当前块指针 file
更新为前一个块。您可以从单向链表的开头遍历或使用双向链接。
realloc
来在以后更改数组的大小。 - Jonathon