首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:(返回指针的函数)的类型冲突

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

Stack Overflow用户
提问于 2020-04-15 02:45:39
回答 1查看 52关注 0票数 0

我定义了一个结构体和一个返回指向该结构体的指针的函数,每当我尝试调用它时,我都会得到一个运行时错误:**错误:‘readVirus’的类型冲突**

代码语言:javascript
复制
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中,并删除了该函数,它工作得很好,所以我不认为这是一个函数实现问题。提前感谢:)

EN

回答 1

Stack Overflow用户

发布于 2020-04-15 02:52:24

拥有

代码语言:javascript
复制
typedef struct virus {
unsigned short SigSize;
char virusName[16];
unsigned char* sig;}

struct virus* readVirus(FILE* file){

首先,结构的'}‘后缺少';’,并且您没有定义类型virus,因此需要在代码中的任何地方使用struct virus

但你可能想要:

代码语言:javascript
复制
typedef struct virus {
  unsigned short SigSize;
  char virusName[16];
  unsigned char* sig;
} virus;

允许只编写病毒,而不使用其定义后的结构

我鼓励您使用大写字符来开始您的类型的名称,所以病毒而不是病毒,这有助于阅读代码,例如与变量的名称进行区分

main中的问题

我收到一个运行时错误,说**错误:‘readVirus’的类型冲突**

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

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

res是指向病毒的指针,但您的强制转换是(char*),类型不同。

您可以使用(virus*)来修复强制转换,但实际上您可以直接删除它。

正在做什么:

res=malloc(sizeof(病毒));res=readVirus(输入);

第一个赋值丢失,导致内存泄漏,删除第一个赋值

注意,在main中不能释放res,在程序结束时这不是问题,除非你想用valgrind这样的工具检查内存使用情况。

在程序接收到参数之前,你没有检查就使用了argv1,我鼓励你在程序一开始就这样做:

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

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

代码语言:javascript
复制
 if (input == NULL) {
   fprintf(stderr, "cannot open %s : ", argv[1], strerror(errno));
   return -1;
 }

用最后一个换行符刷新打印,而您只想打印一个字符串,所以在main中替换

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

通过

代码语言:javascript
复制
puts(res->virusName);

readVirus中的问题

在……里面

读取(&res->SigSize,2,1,文件);读取(&res->virusName,16,1,文件);

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

文件读取(&res->SigSize,sizeof(res->SigSize),1,文件);fread(&res->virusName,sizeof(res->virusName),1,文件);

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

是否确定该文件是二进制文件,其中sigSize是二进制表示?我的意思是,对于大小为1234的文件,包含代码4的字节,然后是代码210的字节,反之亦然

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61214982

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档