错误:类型冲突(返回指针的函数)

时间:2020-04-14 18:45:38

标签: c function file pointers types

我已经定义了一个结构和一个返回该结构的指针的函数,每当我尝试调用它时,都会出现运行时错误提示**错误:“ readVirus”的类型冲突**

typedef struct virus {
unsigned short SigSize;
char virusName[16];
unsigned char* sig;
}virus;

virus* readVirus(FILE* file){
virus *res;
res=(virus*)malloc(sizeof(virus));
fread(&res->SigSize,2,1,file);
fread(&res->virusName,16,1,file);
res->sig=(char*)malloc(res->SigSize);
fread(res->sig,res->SigSize,1,file);
return res; 
free(res);
}


int main(int argc, char **argv) {
FILE *input;
input = fopen(argv[1],"rb");
virus *res;
res=(virus*)malloc(sizeof(virus));
res=readVirus(input);
printf("%s",res->virusName);
free(res);
fclose(input);
}

我试图将readVirus的主体直接复制到main中,并删除了该函数,并且它运行良好,因此我认为它不是函数实现问题。 在此先感谢:)

1 个答案:

答案 0 :(得分:1)

拥有

typedef struct virus {
unsigned short SigSize;
char virusName[16];
unsigned char* sig;}

struct virus* readVirus(FILE* file){

首先一个';'在 struct 的'}'之后丢失,并且您没有定义类型 virus ,因此您需要在每个位置使用 struct virus 您的代码

但是您可能想要:

typedef struct virus {
  unsigned short SigSize;
  char virusName[16];
  unsigned char* sig;
} virus;

允许仅在定义后没有 struct 的情况下编写病毒

我建议您使用大写字母开头的类型名称,因此 Virus 而不是 virus ,可以帮助读取代码,从而与实例变量的名称


问题 主要

我收到一个运行时错误,提示**错误:“ readVirus”的类型相互冲突**

这是您编译程序时产生的消息,而不是执行时产生的消息,这是因为在该行中:

res->sig=(char*)malloc(res->SigSize);

res 是指向病毒的指针,但是您的演员表是(char *),类型不同。

您可以修复 cast 以使用(virus *),但实际上您可以删除它。

这样做:

res=malloc(sizeof(virus));
res=readVirus(input);

第一个作业丢失,导致内存泄漏,删除最重要的作业

注意在 main 中,您也不会释放 res ,在程序结束时这不是问题,除非您要使用像 valgrind

这样的工具

您使用 argv [1] 而不检查程序是否收到参数,我鼓励您在程序开始时执行类似的操作:

int main(int argc, char **argv) {
  if (argc != 2) {
    fprintf(stderr, "Usage: %s <file>\n", *argv);
    return -1;
  }
  else {

我建议您检查 fopen 的结果,以检查是否可以打开文件并在不存在这种情况时发出信号。如果您具有 strerror 函数,请使用它,例如:

 if (input == NULL) {
   fprintf(stderr, "cannot open %s : ", argv[1], strerror(errno));
   return -1;
 }

用最后一个换行符冲洗打印,而您只想打印一个字符串,所以在 main replace

printf("%s",res->virusName);

作者

puts(res->virusName);

问题 readVirus

fread(&res->SigSize,2,1,file);
fread(&res->virusName,16,1,file);

不要使用文字数字作为大小,请使用 sizeof 来获取正确的大小:

fread(&res->SigSize, sizeof(res->SigSize), 1, file);
fread(&res->virusName, sizeof(res->virusNamee), 1, file);

我还建议您检查读取是否成功,并在出现错误时发出信号

您确定文件是二进制文件,其中 sigSize 是二进制表示吗?我的意思是对于文件大小为1234的文件,其中包含代码4的字节,然后包含代码210的字节,或者相反。