Разница между возвратом 1, возвратом 0 и возвратом -1 и выходом?
например, рассмотрим следующий код
int main(int argc,char *argv[])
{
int *p,*q;
p = (int *)malloc(sizeof(int)*10);
q = (int *)malloc(sizeof(int)*10);
if (p == 0)
{
printf("ERROR: Out of memory\n");
return 1;
}
if (q == 0)
{
printf("ERROR: Out of memory\n");
exit(0);
}
return 0;
}
что возвращает 0, return 1, exit (0) сделать в вышеуказанной программе.
exit (0) выйдет из общей программы, и управление выходит из цикла, но что произойдет в случае возврата 0, return 1, return -1.
Ответы
Ответ 1
return
из main()
эквивалентен exit
программа немедленно завершает выполнение с статусом завершения, установленным как значение, переданное в return
или exit
return
во внутренней функции (не main
) немедленно прекратит выполнение конкретной функции, возвращающей данный результат вызывающей функции.
exit
из любого места вашего кода немедленно прекратит выполнение программы.
статус 0 означает, что программа выполнена успешно.
статус, отличный от 0, означает, что программа вышла из-за ошибки или аномалии.
Если вы выходите со статусом, отличным от 0, вы должны печатать сообщение об ошибке на stderr
, поэтому вместо использования printf
лучше что-то вроде
if(errorOccurred) {
fprintf(stderr, "meaningful message here\n");
return -1;
}
обратите внимание, что (в зависимости от операционной системы, в которой вы находитесь) есть некоторые соглашения о кодах возврата.
Google для "кодов статуса выхода" или аналогичных, и вы найдете много информации о SO и в других местах.
Стоит упомянуть, что сама ОС может прервать вашу программу с помощью определенных кодов статуса выхода, если вы попытаетесь выполнить некоторые недопустимые операции, такие как чтение памяти, к которой у вас нет доступа.
Ответ 2
return n
из main
эквивалентен exit(n)
.
Возвращаемое значение - это остальная часть вашей программы. Это значение зависит от ОС. В unix 0 означает нормальное завершение и ненулевое значение указывает, что такая форма ошибки заставляла вашу программу завершаться без выполнения намеченной цели.
Необычно, что ваш пример возвращает 0 (нормальное завершение), когда он, похоже, исчерпал память.
Ответ 3
return n
из вашей основной функции входа завершит процесс и сообщит родительскому процессу (тому, который выполнил ваш процесс) результат вашего процесса. 0 означает УСПЕХ. Другие коды обычно указывают на отказ и его значение.
Ответ 4
Как объяснено здесь, в контексте main
оба return
и exit
делают то же самое
В: Почему нам нужно return
или exit
?
A: Чтобы указать статус выполнения.
В вашем примере, даже если у вас не было операторов возврата или выхода, код будет работать нормально (Предположим, что все остальное синтаксически и т.д.). Кроме того, если (и должно быть) main
возвращает int
вам нужно что return 0
в конце).
Но после выполнения у вас нет способа узнать, работал ли ваш код так, как ожидалось.
Вы можете использовать код возврата программы (в среде * nix, используя $?
), который дает вам код (как установлено exit
или return
). Поскольку вы сами устанавливаете эти коды, вы понимаете, в какой момент код достиг до завершения.
Вы можете написать return 123
, где 123
указывает на успешность проверок после выполнения.
Обычно в средах * nix 0
принимаются как успешные и ненулевые коды в качестве сбоев.
Ответ 5
return
в функции возвращает выполнение обратно вызывающему и exit
из функции завершает работу программы.
in main
Функция return 0
или exit(0)
одинакова, но если вы пишете exit(0)
в другой функции, то программа выйдет из этой позиции.
возврат различных значений, таких как return 1
или return -1
, означает, что программа возвращает ошибку.
Когда exit(0)
используется для выхода из программы, деструкторы для локальных нестатических объектов не вызываются. Но деструкторы вызываются, если используется возврат 0.