C中的半固定,半动态阵列

时间:2016-10-29 23:40:23

标签: c arrays

有没有办法初始化半固定,半动态大小的字符串数组?怎么样?

示例:

char **p[2];

/*Memory allocation here*/

strcpy(p[0][0], "foo");
strcpy(p[0][1], "bar");
strcpy(p[1][0], "baz");  
strcpy(p[1][1], "qux");

2 个答案:

答案 0 :(得分:3)

是的,有办法。

p[0] = malloc(sizeof(char *) * 2); //Two pointers in p[0]
p[1] = malloc(sizeof(char *) * 2); //Two pointers in p[1]

p[0][0] = malloc(sizeof(char) * 4); //4 bytes in p[0][0]
p[0][1] = malloc(sizeof(char) * 4);
p[1][0] = malloc(sizeof(char) * 4);
p[1][1] = malloc(sizeof(char) * 4);

答案 1 :(得分:2)

使用C99中的复合文字,您可以初始化变量p,如下所示:

extern char **p[2];

char **p[2] = (char **[2]){
    (char *[2]){ "foo", "bar" },
    (char *[2]){ "baz", "qux" },
};

extern行会出现在标题中;其余的将放在定义p的源文件中。或者,您可以不使用extern行并将其设为static char **p[2] = …,这可能更好,因为p是全局变量的糟糕名称。

(char **[2]){ … }部分是与p相同类型的复合文字;在里面,它有两个(char *[2]){ … }单位,一个2 char *的数组。

指向的字符串不可修改;如果它们必须是可修改的,你必须更加努力(但可以做到)。

此测试代码演示了它的工作原理:

#include <stdio.h>

int main(void)
{
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 2; j++)
            printf("[%s]", p[i][j]);
        putchar('\n');
    }
    return 0;
}

输出:

[foo][bar]
[baz][qux]

如果你想决定两个字符串数组的指针数组应该在运行时多长时间(所以你可以在某个时候添加{ "abc", "def" }{ "pqr", "xyz" }),那么你需要进入动态内存分配,但你可能不会有一个固定的字符串列表开始。您将从(配置?)文件或类似文件中读取它们。