【问题标题】:Peculiar warnings at CC 处的特殊警告
【发布时间】:2014-02-13 16:09:00
【问题描述】:

在我的项目中,我有这两个文件。当我尝试编译它时,会得到一些我无法解决的特殊警告,尽管我的程序运行良好。我在编译时使用 -Wall 和 -Wextra 参数。

//File: DataStructures.h 
     typedef struct EntryListPacketStruct EntryListPacket;
        typedef struct IndexesPacketStruct IndexesPacket;
        typedef struct MatchingQueriesResultStruct MatchingQueriesResult;
        typedef struct DataPacketStruct* DataPacketPtr;

        extern DataPacketPtr Packet;

        EntryListPacket* allocateEntryListPacket(void);

        void initializeDataPacket(DataPacketPtr);
        void freeDataPacket(DataPacketPtr);

        void initializeEntryListPacket(EntryListPacket*);
        void freeEntryListsPacket(EntryListPacket*);

我将 DataStructures.h 包含在以下文件中:

//File: DataStructures.c
 struct EntryListPacketStruct {
        EntryList* exactTypeEntryList;
        EntryList** editDistEntryLists;
        EntryList** hammingDistEntryLists;
    };

    struct DataPacketStruct {
        struct EntryListPacket* entryLists;
        struct IndexesPacket* indexes;
        dllistptr matchingQResultList;
    };

EntryListPacket* allocateEntryListPacket(void){
    EntryListPacket* temp=malloc(sizeof(EntryListPacket));
    return temp;
}

 void initializeDataPacket(DataPacketPtr packet){
     DataPacketPtr temp;

     temp=malloc(sizeof(struct DataPacketStruct));

     initializeEntryListPacket(temp->entryLists);

     initializeIndexesPacket(temp->indexes);

     packet=temp;
 }

 void freeDataPacket(DataPacketPtr packet){

     freeEntryListsPacket(packet->entryLists);
     freeIndexesPacket(packet->indexes);
     free(packet);
 }

void initializeEntryListPacket(EntryListPacket* packet) {

    packet->exactTypeEntryList = NULL;

    packet->editDistEntryLists = malloc(sizeof (EntryList)*22);
    int i;
    for (i = 0; i < 22; i++) {
        packet->editDistEntryLists[i] = NULL;
    }


    packet->hammingDistEntryLists = malloc(sizeof (EntryList)*27);
    for (i = 0; i < 27; i++) {
        packet->hammingDistEntryLists[i] = NULL;
    }
}

 void freeEntryListsPacket(EntryListPacket* packet){
     if(packet->exactTypeEntryList!=NULL)
        DestroyEntryList(packet->exactTypeEntryList);
     free(packet->exactTypeEntryList);

     int i;
     for(i=0;i<22;i++){
         if(packet->editDistEntryLists[i]!=NULL){  
              printf("%d\n",i); 
             DestroyEntryList(packet->editDistEntryLists[i]);

         }
         free(packet->editDistEntryLists[i]);       
     }
     free(packet->editDistEntryLists);

     for(i=0;i<27;i++){
         if(packet->hammingDistEntryLists[i]!=NULL){      
              printf("%d\n",i); 
             DestroyEntryList(packet->hammingDistEntryLists[i]);              
         }
         free(packet->hammingDistEntryLists[i]);   
     }
     free(packet->hammingDistEntryLists);
     free(packet);   
 }

//文件:main.c

EntryListPacket *temp;
    temp=allocateEntryListPacket();
    initializeEntryListPacket(temp);

    freeEntryListsPacket(temp);

我收到以下警告:

 DataStructures.c: In function ‘initializeDataPacket’:
    DataStructures.c:48:6: warning: passing argument 1 of ‘initializeEntryListPacket’ from incompatible pointer type [enabled by default]
          initializeEntryListPacket(temp->entryLists);
          ^
    In file included from DataStructures.c:6:0:
    DataStructures.h:27:10: note: expected ‘struct EntryListPacket *’ but argument is of type ‘struct EntryListPacket *’
         void initializeEntryListPacket(EntryListPacket*);
              ^
    DataStructures.c:50:6: warning: passing argument 1 of ‘initializeIndexesPacket’ from incompatible pointer type [enabled by default]
          initializeIndexesPacket(temp->indexes);
          ^
    In file included from DataStructures.c:6:0:
    DataStructures.h:30:10: note: expected ‘struct IndexesPacket *’ but argument is of type ‘struct IndexesPacket *’
         void initializeIndexesPacket(IndexesPacket*);
              ^
    DataStructures.c:43:42: warning: parameter ‘packet’ set but not used [-Wunused-but-set-parameter]
      void initializeDataPacket(DataPacketPtr packet){
                                              ^
    DataStructures.c: In function ‘freeDataPacket’:
    DataStructures.c:57:6: warning: passing argument 1 of ‘freeEntryListsPacket’ from incompatible pointer type [enabled by default]
          freeEntryListsPacket(packet->entryLists);
          ^
    In file included from DataStructures.c:6:0:
    DataStructures.h:28:10: note: expected ‘struct EntryListPacket *’ but argument is of type ‘struct EntryListPacket *’
         void freeEntryListsPacket(EntryListPacket*);
              ^
    DataStructures.c:58:6: warning: passing argument 1 of ‘freeIndexesPacket’ from incompatible pointer type [enabled by default]
          freeIndexesPacket(packet->indexes);
          ^
    In file included from DataStructures.c:6:0:
    DataStructures.h:31:10: note: expected ‘struct IndexesPacket *’ but argument is of type ‘struct IndexesPacket *’
         void freeIndexesPacket(IndexesPacket*);

我无法弄清楚我做错了什么,或者编译器是否被卡住,例如:DataStructures.h:28:10: note: expected ‘struct EntryListPacket *’ but argument is of type ‘struct EntryListPacket *’ 对我来说似乎不合理。 提前谢谢!

【问题讨论】:

  • 你用的是什么编译器?
  • 你是如何调用这些函数的?
  • @arunb2w 我将编辑帖子以回答您的问题
  • 再次迷失在typedefs ... ;-) 不错的错误信息,但是你被激怒了!
  • 您的.c 文件是否包含.h 文件?

标签: c warnings


【解决方案1】:

您的 struct 标记包含一个 Struct 后缀,但您在声明时省略了它:

struct DataPacketStruct {
    struct EntryListPacket* entryLists;
    struct IndexesPacket* indexes;
    dllistptr matchingQResultList;
};

应该是:

struct DataPacketStruct {
    struct EntryListPacketStruct* entryLists;
    struct IndexesPacketStruct* indexes;
    dllistptr matchingQResultList;
};

或者只是:

struct DataPacketStruct {
    EntryListPacket* entryLists;
    IndexesPacket* indexes;
    dllistptr matchingQResultList;
};

另外,您的 initializeDataPacket 函数正在泄漏内存。将temp 分配给packet 不会返回值,因为packet 是按值传递的,而不是按引用传递的。

【讨论】:

  • 实际上,从initializeDataPacketinitializeEntryListPacketinitializeIndexesPacket 的调用很可能会导致崩溃,因为您正在取消引用从未在新分配的DataPacketStruct 中初始化的指针
【解决方案2】:

DataStructures.h,尝试替换这个:

struct DataPacketStruct {
    struct EntryListPacket* entryLists;
    ...

有了这个:

struct DataPacketStruct {
    EntryListPacket* entryLists;
    ...

或者这个:

struct DataPacketStruct {
    struct EntryListPacketStruct* entryLists;
    ...

struct IndexesPacket* indexes; 也是如此。编译器警告来自缺少 typedef 符号和 struct 符号本身。

【讨论】:

  • struct IndexesPacket* indexes; 的同样问题。
  • @mbratch 是的,这解决了我的问题,但为什么会发生?由于我 typedef 结构,编译器不知道它们是同一个东西吗?
  • 根据您的声明,这个struct EntryListPacket* entryLists; 会以某种方式导致struct struct EntryListPacketStruct * entryLists;
  • @Mario 在技术上它们是相同的,但在语法上却不同。您有struct EntryListPacketStructEntryListPacket,它们的类型定义为struct EntryListPacketStruct。编译器足够宽容,可以让你说struct EntryListPacket,但它在语法上不够精确,无法避免警告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
相关资源
最近更新 更多