programing

주 ()에 있는 주 ()를 c로 호출하기

stoneblock 2023. 10. 16. 21:28

주 ()에 있는 주 ()를 c로 호출하기

전화 가능한가요?main()내부에main()c에서 기능합니까?

예, C를 사용하면 메인 함수를 호출할 수 있습니다(C++는 호출하지 않음)

전화하는 것은 정말로 허용됩니다.main()다른 재귀적 코드에 사용되는 것과 동일한 방식으로 스택 오버플로를 피하더라도 다음과 같은 종료 조건이 적용됩니다.

#include <stdio.h>
int main (int argc, char *argv[]) {
    printf ("Running main with argc = %d, last = '%s'\n",
        argc, argv[argc-1]);
    if (argc > 1)
        return main(argc - 1, argv);
    return 0;
}

로 실행될 때testprog 1 2 3, 출력:

Running main with argc = 4, last = '3'
Running main with argc = 3, last = '2'
Running main with argc = 2, last = '1'
Running main with argc = 1, last = 'testprog'

하지만 그것은 일화적인 증거일 뿐이기 때문에, 우리는 기준으로 눈을 돌려야 합니다.ISO C11 섹션4 Conformance상태:

1/ 본 국제 표준에서 "할 것"은 구현 또는 프로그램에 대한 요구 사항으로 해석되며, 반대로 "할 것"은 금지 사항으로 해석됩니다.

2/ 제약 조건 또는 런타임 제약 조건을 벗어나 나타나는 "해야 한다" 또는 "하지 말아야 한다" 요구 사항을 위반하면 동작이 정의되지 않습니다.미정의 행위는 이 국제 표준에서 "미정의 행위"라는 단어 또는 행위에 대한 명시적인 정의를 생략함으로써 달리 표시됩니다.이 세 가지는 강조점에 차이가 없습니다; 그들은 모두 "정의되지 않은 행동"을 묘사합니다.

3/ 특정되지 않은 행동을 포함하는 다른 모든 면에서 올바른, 올바른 데이터로 작동하는 프로그램은 올바른 프로그램이어야 하며 5.1.2.3에 따라 행동해야 합니다.

자, 기준 어디에도 명시적인 금지 조항이 없기 때문에main()그 자체를 부르는 것, 위의 조항 3은 통제적인 측면입니다.

추가 지원은 두 곳(나의 굵은 글씨체)에서 볼 수 있습니다(첫 번째 섹션).5.1.2.2.3 Program termination:

1/ 다음의 리턴 타입인 경우main함수는 다음과 호환되는 유형입니다.int, 최초 전화에서 에의 귀환.main함수는 를 호출하는 것과 같습니다.exitfunction 은 값을 반환합니다.main그 논거로서 기능합니다.

그다음에 구간별로.7.21.3 Files:

5/ 파일은 동일 또는 다른 프로그램 실행에 의해 나중에 다시 열 수 있으며 내용은 회수 또는 수정될 수 있습니다(시작 시 위치를 변경할 수 있는 경우).만약에main함수는 원래 호출자에게 반환됩니다. 또는 만약exit함수가 호출되며, 프로그램 종료 전에 열려 있는 모든 파일이 닫힙니다(hence 모든 출력 스트림이 플러시됨).

이 두 하위 섹션 모두 다음에 대한 다른 호출이 있을 가능성을 뒷받침합니다.main()최초/최초의 것 이상으로

네, 메인() 함수 내에서 메인()을 호출할 수 있습니다.

함수 자체가 함수를 호출하는 과정을 Recursion(재귀)이라고 합니다.

자, 메인() 함수 내에서 메인() 함수를 호출할 수 있지만, 프로그램을 종료하려면 메인() 함수를 호출하지 않는 조건이 있어야 합니다.

그렇지 않으면 프로그램이 무한히 되돌아와 실행되지 않습니다.

, 가능합니다.

간단한 프로그램:

int main()
{
    printf("Anything");
    main();
    return 0;
}

설명:

A call stack아니면function stack는 몇 가지 관련된 목적으로 사용되지만, 이를 사용하는 주된 이유는 각 활성 서브루틴이 실행이 완료되면 컨트롤을 반환해야 하는 지점을 추적하기 위해서입니다.

A stack overflow콜 스택에서 메모리가 너무 많이 사용될 경우 발생합니다.

main()를 반복적으로 호출하고 반환 주소는 스택에 저장됩니다.스택 메모리가 가득 찬 후.보여줍니다.stack overflow error.

언급URL : https://stackoverflow.com/questions/4238179/calling-main-in-main-in-c