我定义了一个结构体和一个返回指向该结构体的指针的函数,每当我尝试调用它时,我都会得到一个运行时错误:**错误:‘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中,并删除了该函数,它工作得很好,所以我不认为这是一个函数实现问题。提前感谢:)
发布于 2020-04-15 02:52:24
拥有
typedef struct virus {
unsigned short SigSize;
char virusName[16];
unsigned char* sig;}
struct virus* readVirus(FILE* file){首先,结构的'}‘后缺少';’,并且您没有定义类型virus,因此需要在代码中的任何地方使用struct virus
但你可能想要:
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,我鼓励你在程序一开始就这样做:
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中替换
printf("%s",res->virusName);
通过
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的字节,反之亦然
https://stackoverflow.com/questions/61214982
复制相似问题