【问题标题】:pointer to function that return pointer to struct指向返回结构指针的函数的指针
【发布时间】:2015-11-25 14:53:08
【问题描述】:

我正在尝试编写一种ArrayList(结构),定义如下:

typedef struct {
    int reservedSize; // reserved size
    int size; // Size of list
    void ** pElements; //pointer to list elements
    void (*deleteArrayList)();
    void (*add)();
    void (*remove)();
    void (*set)();
    void* (*get)();
    int (*indexOf)();
    int (*len)();
    void (*clear)();
    void (*push)();
    void* (*pop)();
    int (*contains)();
    int (*isEmpty)();
    //Extras
    int (* containsAll)();
    struct ArrayList* (*clone)(); //trouble1
    struct ArrayList* (*subList)();//trouble2 
} ArrayList;

如您所见,两个元素类型为int,以及指向函数的指针,但我只对最后两个有问题。我有一个初始化器如下:

ArrayList* al_newArrayList(void) { 
    ArrayList* list;
    list = (ArrayList *) malloc (sizeof(ArrayList));
    list->size = 0;
    list->pElements = malloc(sizeof(void *) * 10);
    list->reservedSize = 10;
    list->add = al_add;
    list->deleteArrayList = al_deleteArrayList;
    list->remove = al_remove;
    list->set = al_set;
    list->get = al_get;
    list->indexOf = al_indexOf;
    list->len = al_len;
    list->clear = al_clear;
    list->push = al_push;
    list->pop = al_pop;
    list->contains = al_contains;
    list->isEmpty = al_isEmpty;
    list->containsAll = al_containsAll;
    list->clone = al_clone;//trouble1
    list->subList = al_subList;//trouble2
    return list;
}

程序可以运行,但出现运行时错误,并且我在以下位置收到错误引用警告:

list->clone = al_clone;//trouble1
list->subList = al_subList;//trouble2

即使这些功能有效,但程序已关闭。你有什么主意吗?语法错误?

【问题讨论】:

  • 添加一些格式将帮助您使您的代码更具可读性。
  • 你必须发布 al_subListal_clone 函数,我希望你没有返回指向本地声明的结构的指针(从堆栈中)。
  • 你知道你几乎完全禁止了编译器的自动类型检查吗?这是一个非常糟糕的主意。
  • @milevyo 不,我没有
  • 您应该强烈考虑对ArrayList 类型的函数指针成员使用原型声明。

标签: c pointers struct self-reference


【解决方案1】:
typedef struct {
    int reservedSize; // reserved size
    int size; // Size of list
    // ...
    struct ArrayList* (*clone)(); //trouble1
    struct ArrayList* (*subList)();//trouble2 
} ArrayList;

当编译器到达“麻烦”行时,没有名为 struct ArrayList 的类型。

有一个没有定义标记名的结构类型。

在该定义的末尾,将定义一个名为 ArrayList 的类型(一个没有标记名的结构类型)。

解决方案:

定义类型struct ArrayList

typedef struct ArrayList {             // define type with tagname
    int reservedSize; // reserved size
    int size; // Size of list
    // ...
    struct ArrayList* (*clone)(); //trouble1
    struct ArrayList* (*subList)();//trouble2 
} ArrayList;

【讨论】:

  • struct ArrayList... } ArrayList; 行不会给出类似 redefining the name ArrayList 的编译器错误吗?
  • 非常感谢您的帮助,它已修复,谢谢!现在它完美地工作了。这个项目是我期末考试的先决条件。
  • @Killa,你必须接受答案,或者至少给他投票(如果可能的话)
  • @Jupiter:不,typedefs 和 structs 使用两个不同的名称空间。
  • 没有重新定义。标识符ArrayList 存在于全局范围内,标识符struct ArrayList 存在于结构范围内。这两个作用域在 C 中不冲突。
【解决方案2】:

感谢@pmg 指点我。

typedef struct ArrayList ArrayList;
struct ArrayList{
    int reservedSize; // reserved size
    int size; // Size of list
    void ** pElements; //pointer to list elements
    void (*deleteArrayList)();
    void (*add)();
    void (*remove)();
    void (*set)();
    void* (*get)();
    int (*indexOf)();
    int (*len)();
    void (*clear)();
    void (*push)();
    void* (*pop)();
    int (*contains)();
    int (*isEmpty)();
    //Extras
    int (* containsAll)();
    struct ArrayList* (*clone)(); //trouble1
    struct ArrayList* (*subList)();//trouble2 
};

【讨论】:

  • @sth 我投了他的票。我邀请人们投票支持他,All thanks goes to 的意思是
  • 是的,我把你和提问者弄糊涂了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 2016-04-21
  • 1970-01-01
  • 2013-04-10
相关资源
最近更新 更多