Разница между возвратом 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.