2014-09-15 7 views
8

이 인수를 사용하는 것에 대해 알고 있고, 인수를 사용하는 방법을 알고 있습니다.메모리 할당 및 ** argv 인수

아직 이해할 수없는 것들이 하나 있습니다. 프로그램이 입력에서 온 문자열에 메모리를 할당하는 방법. ** argv는 프로그램 시작시 할당 된 메모리를 가지고 있지 않습니까? 나는 segfault를 기대했지만, 그런 일은 일어나지 않았다.

아무도이 메모리 할당이 어떻게 작동 하는지를 알고 있습니까?

+1

무엇을 제공합니까? 응? – thang

+2

"할당 된 메모리가 없다"는 것은 무엇을 의미합니까? argv에있는 포인터는 모두 유효하며 액세스하기에 안전한 메모리를 가리 킵니다. segfault를 생성하기 위해 어떤 코드를 예상 했습니까? – Wyzard

+4

'main()'이 호출되기 전에 런타임 라이브러리에 의해 할당됩니다. –

답변

12

C/C++ 런타임은 명령 줄 인수를 처리하고 인수가있는 메모리 영역을 만듭니다. 그런 다음 당신의 main()을 당신에게 인수가 저장되어있는 영역에 대한 포인터와 함께 인수의 개수를 제공합니다.

따라서 C/C++ 런타임은 할당 된 메모리 영역을 소유하며 main()이 반환되거나 다른 C/C++ 함수가 exit()과 같은 프로그램을 중지하는 데 사용되면 영역 할당을 해제하기 위해 C/C++ 런타임이 결정합니다 .

이 절차는 Unix에서 C를 사용하여 시작되었으며 C++위원회에서 유지 관리하려고 시도한 하위 호환성을 제공하기 위해 C++ 용으로 유지되었습니다.

일반적으로 프로그램이로드 될 때 로더에 의해 시작되는 진입 점은 main() 함수가 아니라 C/C++ 런타임에 정의 된 진입 점입니다. C/C++ 런타임은 초기화가 완료되면 C/C++ 런타임에 의해 main() 함수가 호출 될 때 C/C++ 표준이 말하는 환경을 설정하기 위해 다양한 종류의 초기화를 수행합니다.

이 초기화 중 단계 중 하나는 제공된 명령 줄 인수를 구문 분석 한 다음 해당 함수 인수로 main() 함수에 제공됩니다.