имеющий
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 , которые помогают при чтении кода различать имена переменных например,
Проблемы в main
Я получаю сообщение об ошибке выполнения, говорит ** ошибка : конфликтующие типы для '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;
}
Flu sh при печати последней строки, и вы просто хотите напечатать строку, поэтому в 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 или наоборот