Почему это дает (ненулевой) код ошибки при завершении? - PullRequest
0 голосов
/ 11 сентября 2018

Этот код выполняется, даже выдает ожидаемый результат.Однако в журнале сборки я всегда получаю Process terminated with status 2 (0 minute(s), 5 second(s)) или какой-либо другой вариант этого журнала.

Код -

#include<stdio.h>
#include<conio.h>

void main() {

printf("Please enter a character");
char ch = getch();

ch++;
printf("\n%c", ch);


} 

Пример вывода (входное значение было «а» без кавычек) -

Please enter a character
b

Ответы [ 4 ]

0 голосов
/ 11 сентября 2018

Поскольку вы объявили main без действительной подписи (т. Е. Вы дали ему тип возврата void), вы не можете ничего предположить относительно значения, которое фактически возвращается операционной системе. Если вы компилируете для архитектуры x86, то вот что вероятно происходит, чтобы объяснить возвращаемое значение 2:

main:
    ...
    call printf
    add esp, 8
    ; return value from printf is in EAX register
    ret 

printf возвращает количество символов, записанных в стандартный вывод, 2 в вашем случае со строкой формата \n%c. Возвращаемое значение из printf все еще находится в регистре, предназначенном для хранения возвращаемых значений (EAX) при выходе из main, поэтому main возвращает это.

0 голосов
/ 11 сентября 2018

Прежде всего, я бы порекомендовал проверить Каковы действительные подписи для функции main () в C? .

Для размещенной среды void не является допустимым типом возврата для main().

При этом, согласно этой сигнатуре функции, тип возвращаемого значения - void, что указывает на то, что вызов main() ничего не возвращает вызывающей стороне (среде). Теперь из среды попробуйте получить доступ к возвращаемому значению [то есть, приглашение, которое вы получаете] будет в лучшем случае неопределенным. Стандарт С не определяет никакого поведения для этого.

0 голосов
/ 11 сентября 2018

Если вы ничего не возвращаете из main, может быть возвращено любое значение.В вашем случае ваша программа возвращает 2, как указано в сообщении (status 2).Вам необходимо вернуть 0, чтобы уведомить другие программы об успешном запуске вашей программы.

int main() {
   ....
   return 0;
} 
0 голосов
/ 11 сентября 2018

Если вы объявляете main как int main(void) или int main(int argc, char *argv[]), то текущий стандарт C говорит, что достижение }, заканчивающееся main, возвращает значение 0. Это также верно, если объявлено main с типом возврата, совместимым с int, но с параметрами, определенными реализацией C.

Если вы объявляете main иначе, как с void main(), стандарт C не говорит о том, каково поведение, и это зависит от вашей реализации на C.

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