prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 20.2

Q存储文本行的好数据结构是什么?我开始使用固定大小的数组的数组char,但它们太受限制了。


A一种好的方法是使用一个指向一组指针(每个指针都模拟一个数组)的指针(模拟一个数组)char。这种数据结构有时被称为“锯齿数组”,看起来像这样

[此处放置图]

您可以使用这些简单的声明来设置上面图中的微型数组

char *a[4] = {"this", "is", "a", "test"};
char **p = a;
(其中p是指向指向chara是一个中间数组,用于分配指向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函数,可以简化内部的mallocstrcpy调用。它不是标准的,但实现类似的东西显然是微不足道的。)

下面是一段代码片段,它使用相同类型的锯齿数组将整个文件读入内存。此代码基于问题中的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


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管