Как указывали другие, проблема в том, что вы передаете неправильный тип аргумента userComFunction
. Но реальная проблема заключается в том, что ваш компилятор не говорит вам об этом.
Начиная с C90 (это два стандарта назад), вызов функции без видимого объявления был законным, и компилятор сделал бы предположения (часто неверные) о том, как выглядит функция. Когда компилятор видит вызов userComFunction
, он не видел объявления или определения для userComFunction
, поэтому он не может диагностировать вашу ошибку.
Начиная с C99, вызов функции без видимого объявления является нарушением ограничения , что означает, что компилятор должен предупредить вас об этом. C99 также сбросил «неявное правило int
», поэтому вы больше не можете опускать тип возвращаемого значения в объявлении функции; main
должен быть объявлен с возвратом int
(неvoid
!) И userComFunction
, так как он ничего не возвращает, должен быть void
.
Вы можете либо перейти полное определение userComFunction
выше определения main
, или вы можете оставить определение, где она есть, и добавить «вперед» заявление:
void userComFunction(struct userCom *return_type);
int main(void) {
/* ... */
}
void userComFunction(struct userCom *return_type) {
/* ... */
}
Когда вы сделаете это, компилятор что вы сообщите, что ваш звонок:
userComFunction(com);
является неправильным. (Исправлено изменение com
на &com
.)
Вы также должны использовать параметры командной строки gcc, чтобы включить дополнительные предупреждения. Например:
gcc -std=c99 -pedantic -Wall -Wextra
-std=c99
говорит соблюдение правил ISO C99. -pedantic
говорит действительно обеспечивает соблюдение этих правил. -Wall
и -Wextra
включить дополнительные предупреждения.
Вам необходимо передать ссылку на указатель. Попробуйте «userComFunction (& com)» –
Попробуйте включить все предупреждения при компиляции (например, gcc -Wall). Это должно указывать на проблему. – Chris
Кстати, у вас отсутствуют возвращаемые типы функций. используйте опцию 'gcc -Wall'. –