访问C中列表中的结构成员

时间:2017-06-03 20:46:29

标签: c arrays pointers struct

我一直在K& R的练习中学习C,我遇到了一个奇怪的问题。我编写了一个程序来计算文件中的单词,字符和行,然后绘制一个直方图,显示每个文件的计数。一切都运行良好,直到我尝试使用结构使我的代码更可重用。我的结构如下:

struct category {
    char *name;
    int namelen;
    int count;
};

它的值由构造函数指定:

struct category createCat(char *name) {
    struct category cat = {name, get_width(name), 0};
return cat;
}

最后我有一个由所有类别组成的列表,如下所示:

struct category catList[] = {words, lines, characters};

当我按名称访问这些结构的成员时,我没有任何问题。但是如果我尝试在循环中访问它们,通过catList[i].member,成员count总是返回0.其他两个成员,name和namelen,正确地处理循环,并访问{{1}从循环外部返回正确。如果有人愿意帮助我了解正在发生的事情,我会非常感激。

如果有必要,这是我的完整计划:

count

2 个答案:

答案 0 :(得分:1)

执行此操作时:

struct category catList[] = {words, lines, characters};

将3个结构的数据复制到catList。因此,当您按名称更新3个结构时,catList中的结构将是不同的副本,并且不会更新。

要解决此问题,我建议使用指针类型。有两种方法可以做到这一点。

  1. 您可以使用createCat方法返回指针。

    struct category* createCat(char *name) {
        struct category* cat = (struct category*) malloc(sizeof(struct category));
        //...
        return cat;
    }
    

    从此时起,始终使用指针进行存储。这是很常用的。

  2. 您可以将指针存储在数组catList中:

    struct category *catList[] = {&words, &lines, &characters};
    

    当你在循环中使用它们时,请使用:

    catList[i]->count++;
    

答案 1 :(得分:0)

您正在将if ((mode & S_ISTXT) == S_ISTXT)结构复制到列表中。

但是在处理数据之前这样做,所以它们永远不会得到更新。

如果要维护这两组结构,则必须在循环中更新它们:

words, lines, characters

如果要维护单个设置,请删除另一个。 (几乎你现在拥有的,除了顶部和底部。)

如果您希望它们共享数据,则使用指针,因此列表(或独立变量)指向其他结构。