我不明白为什么会这样。我可以调用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; |
答案 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
结构的指针。
不要混用PNGDataPtr
和PNGData *
- 他们是同一件事,你自己也会感到困惑。
理想情况下,完全摆脱PNGDataPtr
。如果您坚持这个想法,总是使用PNGDataPtr
而永远不会使用PNGData *
。只是不要混合它们。