ошибка: конфликтующие типы для (функция, которая возвращает указатель) - PullRequest
0 голосов
/ 14 апреля 2020

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

1 голос
/ 14 апреля 2020

имеющий

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 или наоборот

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...