我需要在C中存储一个名单列表。我决定使用双指针(或指针指针)的好方法。
所以我会有一系列名字。每个数组值都是指向另一个数组的指针:名称,存储为字符数组。
名称可能类似
unsigned char *name = "Joseph";
等
然后我会有一个名字列表(双指针),我可以(动态地)分配每个名称(单指针)。
(type) **listOfNames;
我的问题是:双指针应该是什么 type ?因为它是指向指针的指针,所以我认为它必须足够大以容纳任意内存地址:unsigned long
,也许?或者是否有另一种专门用于双指针的类型?
或者 - 是否有更好的方法来存储可变长度数组或可变长度字符串?
答案 0 :(得分:1)
如果您有一组unsigned char *
值:
unsigned char *name_0 = "Joseph";
unsigned char *name_1 = "Helen";
unsigned char *name_2 = "Maximillian";
然后你可以创建:
unsigned char *data[] = { name_0, name_1, name_2 };
unsigned char **listOfNames = data;
请注意,您需要为指针列表分配空间 - 在我的代码中,这是data
数组。您可以使用malloc()
代替,但您需要记住在某个时刻对匹配的free()
进行编码。
添加适当的const
资格对于感兴趣的读者来说是一种挫败感。
如果您正在从文件运行时读取一个可变长度的名称列表,每行(可能)一个名称,那么您最好使用POSIX getline()
和strdup()
。< / p>
必须有许多其他问题可以解决这个问题,所以我会对这段代码很简洁:
char **read_file(FILE *fp)
{
char *buffer = 0;
size_t bufsiz = 0;
char **lines = 0;
size_t n_lines = 0;
size_t n_alloc = 0;
while (getline(&buffer, &bufsiz, fp) > 0)
{
if (n_lines + 1 >= n_alloc)
{
size_t new_num = (n_alloc + 1) * 2;
size_t new_size = new_num * sizeof(*lines);
char **new_lines = realloc(lines, new_size);
if (new_lines == 0)
{
free(buffer);
free(lines);
return(0);
}
lines = new_lines;
n_alloc = new_num;
}
lines[n_lines++] = strdup(buffer); // Includes newline!
}
lines[n_lines] = 0; // Null terminate list of strings
free(buffer); // Release input line's memory
return lines;
}
请注意,代码使用普通char
而非unsigned char
。如果您使用unsigned char
,则会遇到一些问题,因为getline()
和strdup()
都不希望与unsigned char
一起使用。虽然你可以解决这个问题,但这样做很麻烦。