Q存储文本行的好数据结构是什么?我开始使用固定大小的数组的数组char,但它们太受限制了。
A一种好的方法是使用一个指向一组指针(每个指针都模拟一个数组)的指针(模拟一个数组)char。这种数据结构有时被称为“锯齿数组”,看起来像这样
[此处放置图]
您可以使用这些简单的声明来设置上面图中的微型数组
char *a[4] = {"this", "is", "a", "test"}; char **p = a;(其中p是指向指向char和a是一个中间数组,用于分配指向char).
要真正进行动态分配,您当然需要调用malloc:
#include <stdlib.h> char **p = malloc(4 * sizeof(char *)); if(p != NULL) { p[0] = malloc(5); p[1] = malloc(3); p[2] = malloc(2); p[3] = malloc(5); if(p[0] && p[1] && p[2] && p[3]) { strcpy(p[0], "this"); strcpy(p[1], "is"); strcpy(p[2], "a"); strcpy(p[3], "test"); } }(有些库有strdup函数,可以简化内部的malloc和strcpy调用。它不是标准的,但实现类似的东西显然是微不足道的。)
下面是一段代码片段,它使用相同类型的锯齿数组将整个文件读入内存。此代码基于问题中的agetline函数7.30。
#include <stdio.h> #include <stdlib.h> extern char *agetline(FILE *); FILE *ifp; /* assume ifp is open on input file */ char **lines = NULL; size_t nalloc = 0; size_t nlines = 0; char *p; while((p = agetline(ifp)) != NULL) { if(nlines >= nalloc) { nalloc += 50; #ifdef SAFEREALLOC lines = realloc(lines, nalloc * sizeof(char *)); #else if(lines == NULL) /* in case pre-ANSI realloc */ lines = malloc(nalloc * sizeof(char *)); else lines = realloc(lines, nalloc * sizeof(char *)); #endif if(lines == NULL) { fprintf(stderr, "out of memory"); exit(1); } } lines[nlines++] = p; }(请参阅问题7.30中关于重新分配策略的注释。)
另请参见问题6.16。