指针指针:具有可变长度字符串的数据类型是什么?

时间:2014-09-01 22:33:55

标签: c arrays pointers types

我需要在C中存储一个名单列表。我决定使用双指针(或指针指针)的好方法。

所以我会有一系列名字。每个数组值都是指向另一个数组的指针:名称,存储为字符数组。

名称可能类似

unsigned char *name = "Joseph";

然后我会有一个名字列表(双指针),我可以(动态地)分配每个名称(单指针)。

(type) **listOfNames;

我的问题是:双指针应该是什么 type ?因为它是指向指针的指针,所以我认为它必须足够大以容纳任意内存地址:unsigned long,也许?或者是否有另一种专门用于双指针的类型?

或者 - 是否有更好的方法来存储可变长度数组或可变长度字符串?

1 个答案:

答案 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一起使用。虽然你可以解决这个问题,但这样做很麻烦。