向Flexible Array成员添加元素

时间:2016-01-24 00:27:24

标签: c flexible-array-member

我已阅读并查看了灵活数组成员的一些示例,但我不确定如何添加和读取此可变长度数组的元素。

Toast.makeText()

1)有人可以告诉我一个如何向这个弹性长度成员添加元素并在存储后打印它的示例。

2)我也想知道如何正确地使用它。根据我读到的关于Flexible Array Members的内容,我们需要为灵活的数组成员添加更多空间,而不能只使用new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { Toast toast = Toast.makeText(mContext, "Something", Toast.LENGTH_SHORT); } }); 。我唯一的问题是我怎么知道为这个灵活的成员添加了多少。

3 个答案:

答案 0 :(得分:1)

您应该修改struct以添加分配结构中存在的课程数量:

typedef struct School {
    char *name;
    int ncourses;
    char *courses[]; //Flexible Array Member
} School;

假设您有2所学校,一所有3门课程,一所有2所。您可以这样分配结构:

School *mc = malloc(offsetof(struct School, courses) + 3 * sizeof(char *));
mc->name = strdup("Math College");
mc->ncourses = 3;
mc->courses[0] = strdup("Math 101");
mc->courses[1] = strdup("Math 102");
mc->courses[2] = strdup("Math 103");

School *ps = malloc(offsetof(struct School, courses) + 2 * sizeof(char *));
ps->name = strdup("Psycho School");
ps->ncourses = 2;
ps->courses[0] = strdup("Psycho 101");
ps->courses[1] = strdup("Unknown 404");

如您所见,可以像访问任何其他数组元素一样访问变量数组的元素。 malloc调用为结构成员和数组元素(此处为char *指针)分配适当的大小(以字节为单位),它们位于结构的末尾。

您可以使用通用函数来分配和初始化此类结构:

School create_school(const char *school_name, int ncourses, char *courses[]) {
    School *sp = malloc(offsetof(struct School, courses) + ncourses * sizeof(char *));
    sp->name = strdup(school_name);
    sp->ncourses = ncourses;
    for (int i = 0; i < ncourses; i++) {
        sp->courses[i] = strdup(courses[i]);
    }
    return sp;
}

答案 1 :(得分:0)

计算所需结构大小的确切公式为:

size_t need = offsetof(struct School, courses) + num_courses * sizeof(char *);

请注意offsetof的使用。有些人使用sizeof,但由于结构填充,这会引入内存开销。

答案 2 :(得分:0)

本质上,该技术是为结构动态分配足够的内存,以及最后一个数组的元素。

School *data = malloc(sizeof(*data) + number * sizeof(*(data->courses)));

for (i = 0; i < number; ++i)
{
     const char hello[] = "Hello";
     data->courses[i] = malloc(strlen(hello) + 1));   /* sizeof char is 1 by definition */
     strcpy(courses[i], hello);
}