최상의 답변
C 프로그램을 실행할 때 3 개의 열린 파일이 있고 그중 2 개는 STDOUT이라는 것을 알고 있다고 가정합니다. 및 STDERR, 일반 메시지는 stdout으로 이동하고 (예 : printf를 호출 할 때) 오류 메시지는 stderr로 이동합니다 (예를 들어 fprintf (stderr, …)를 호출 할 때이 두 개 (실제로 열린 파일)는 OS에 의해 직접 연결됩니다. Unix 터미널 또는 Windows 터미널이 될 수 있습니다. 가장 중요한 기능은 다음과 같은 경우 Unix에서 리디렉션 될 수 있다는 것입니다. ls | grep file.txt the shell redirect stdout in “ls”and now 해당 출력의 대상은 “grep”프로세스의 STDIN이므로 grep은 해당 스트림에서 패턴을 찾을 수 있습니다. 이것은 강력한 기능입니다. 많은 Unix 필터 (실제로 프로그램)가 이러한 방식으로 빌드되어 강력합니다.
편집 : 더 의미있는 예제 추가 더 중요한 예제로 문제를 파악할 수 있도록 새롭고보다 명시적인 리디렉션 사용을 추가하겠습니다. 다음 명령을보십시오.
컬 http://ftp.gnu.org/gnu/wget/wget-1.17.1.tar.xz | xzcat-| tar xvf-
여기서 curl은 GNU 프로젝트에서 wget을 다운로드하기 시작하고 curl은 STDOUT에 쓰는 데이터를 다운로드하지만 쉘은 curl의 stdout을 xzat의 stdin으로 리디렉션했습니다. 쉘은 동일하게 xzcat의 stdout을 tar의 stdin으로 리디렉션하고 tar는 데이터 압축 해제를 시작합니다. 놀랍습니다!
Answer
첫째, 일반적인 원칙 : 무엇을하든 상관없이 malloc()
는 자동으로 호출되지 않습니다.
struct
를 선언 할 때 유형을 선언합니다. 유형은 그 자체로, 런타임에 메모리를 사용하지 않습니다.
구조체 유형의 변수를 선언하면 메모리가 할당되지만 malloc()
를 사용하지 않습니다. 변수가 로컬 인 경우 함수에 대한 메모리는 일반적으로 스택에 할당됩니다. 이것은 부분적으로 C에서 재 귀성을 가능하게하는 것입니다 : 함수를 호출 할 때마다 (자체 내에서 호출 되더라도) 스택 포인터가 조정되고 새로운 공간은 loc을 위해 스택에 예약되어 있습니다. 함수의 모든 변수와 함수가 종료 될 때마다 스택은 “해제”되고 모든 공간이 해제됩니다.
글로벌 변수를 선언하면 이에 대한 정적 할당이 이루어집니다. 프로그램이 시작될 때 힙이고 변수는 프로그램 실행 내내 계속 사용 가능합니다. 필요한 힙 크기는 컴파일 타임에 알려져 있습니다.
반대로 malloc()
를 사용하면 메모리가 런타임에 운영 체제에 의해 프로그램에 동적으로 할당됩니다. free()
를 사용하여 해제해야합니다. 그렇지 않으면 프로그램 (특히 서비스 응용 프로그램과 같이 다시 시작하지 않고 오랫동안 실행되는 프로그램 인 경우)이 메모리 누수는 성능에 영향을 미치며 극단적 인 경우 전체 시스템 리소스를 고갈시킵니다. malloc()
사용은 a) 필요한 메모리 양이 힙 또는 스택에 할당 할 수있는 양보다 많거나 b) 필요한 메모리 양이 부족할 때 가장 적합합니다. 미리 알고 있습니다.