我已经定义了一个结构和一个返回该结构的指针的函数,每当我尝试调用它时,都会出现运行时错误提示**错误:“ 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中,并删除了该函数,并且它运行良好,因此我认为它不是函数实现问题。 在此先感谢:)
答案 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的字节,或者相反。