如何在C中的函数内共享struct? (我得到了警告:预期&#39; struct <anonymous> **&#39;)</anonymous>

时间:2015-02-03 19:53:44

标签: c pointers

我不明白为什么会这样。我可以调用read_png_file()和*数据(如果我设置了,我可以看到值设置)。但是当我调用next函数时,那里没有数据,但它是类型 (PNGDataPtr *)0x22ff24引用(PNGDataPtr)0x77c02850你能解释一下那里发生了什么以及如何纠正它?我想传递结构并在函数之间共享它。

#include <stdio.h>
#include <stdlib.h>
#include <png.h>

typedef struct
{
    FILE *fp;
} PNGData, *PNGDataPtr;


void read_png_file(char* file_name, PNGData * data)
{
}

void write_png_file(char* file_name, PNGDataPtr * data)
{
}

void process_file(PNGDataPtr * data)
{
}

int main(int argc, char **argv)
{
    PNGData data;
    read_png_file(argv[1], &data);
    process_file(&data);
    write_png_file(argv[2], &data);
    return 0;
}
  

功能&#39;主要&#39;:|
  警告:传递&#39; process_file&#39;的参数1来自不兼容的指针类型
  main.c | 19 |注意:期待&#39; struct **&#39;但是参数的类型为&#39; struct PNGData *&#39; |
  警告:传递&#39; write_png_file&#39;的参数2来自不兼容的指针类型[默认启用] |
  15 |注意:预期&#39; struct **&#39;但是参数的类型为&#39; struct PNGData *&#39; |

2 个答案:

答案 0 :(得分:5)

在write_png_file和process_file的声明中删除*。您已经将PNGDataPtr声明为指针。保留当前的习语你应该将声明更改为以下内容:

void write_png_file(char* file_name, PNGDataPtr data)
void process_file(PNGDataPtr data)

我假设这是你实际系统的代码片段;但在C语言中,我们避免typedef纯粹用于标记某些东西作为指向它的非Ptr对应物。还有一些例外,例如为您希望隐藏底层细节的其他人构建API和库。我建议对结构声明进行以下更改,使其更具惯用性:

typedef struct png_data_t
{
    FILE *fp;
} PNGData;

命名结构将为编译器提供更好的诊断和错误消息。以及对方法声明的以下更改:

void write_png_file(char* file_name, PNGData * data) { }
void process_file(PNGData * data) { }

您的主要方法不需要修改。

答案 1 :(得分:3)

此:

void read_png_file(char* file_name, PNGData * data);

获取指向PNGData结构的指针,但是这个

void write_png_file(char* file_name, PNGDataPtr * data);

获取指向PNGData结构的指针。

不要混用PNGDataPtrPNGData * - 他们是同一件事,你自己也会感到困惑。

理想情况下,完全摆脱PNGDataPtr。如果您坚持这个想法,总是使用PNGDataPtr永远不会使用PNGData *。只是不要混合它们。