레이아웃 C 프로그래밍 언어 프로그램 메모리를 가르쳐

다음에 초점 :

  각 세그먼트를 구성하는 메모리의 C 언어 프로그램

  연결 및 일반적인 오류 동안 C 언어 프로그램의 특징

  실행 C 언어 프로그램

  A : 저장 영역 C 언어 프로그램

  C 언어 코드 (텍스트 파일)에서 (진) 실행 형태는 컴파일 할 필요가 - 어셈블러 - 세 단계를 연결. C 컴파일 과정이 어셈블러 언어 텍스트 파일을 생성, 이진 기계 코드 어셈블러를 형성하는 조립 공정은, 소스 파일을 분리합니다 연결 프로세스 이진 기계 코드 파일을 하나 개의 파일로 결합되어 생성.

  C 언어로 작성된 프로그램을 컴파일 - 연결되면, 여러 부분으로 구성되어 통합 파일을 형성 할 것이다. 여러 다른 프로그램을 실행 부 생성되며, 각 부분은 서로 다른 저장 영역을 나타낸다 :

  1. 코드 세그먼트 (코드 또는 텍스트)

  코드 세그먼트는 조성물의 기계 코드 프로그램에 의해 실행. C 언어에서 프로그램 문 컴파일 된 머신 코드가 형성된다. 프로그램을 실행하는 동안, 차례로 CPU 머신 코드 각 코드 세그먼트는 프로그램 카운터, 프로세서에 의해 실행.

  2. 재생 전용 데이터 세그먼트를 (RO 데이터)

  이들 변수는 변경되지 않기 때문에 읽기 전용 데이터 세그먼트는, 상기 데이터 룩업 테이블 형 동작과 유사한 방식을 이용하여 프로그램에 의해 사용되는 데이터의 일부가 변경되지 않는, 상기 ROM에 저장되어야하는 것만이 필요하다.

  3. 초기화 데이터 구역을 읽고 (RW 데이터)를 작성하여

  초기화 된 데이터가 프로그램 문을 읽고, 변수의 초기 값을 구비하고, 이들 변수는 프로그램 실행 중에 메모리 공간을 차지는 판독 - 기록되는 메모리 영역 내에 위치되어야하고, 초기 값과, 런타임 물품.

  4. 초기화 데이터 세그먼트 (BSS)

  초기화되지 않은 데이터는 프로그램이 실행되기 전에 이러한 변수는 메모리에 공간을 차지하지 않는 프로그램에 선언하지만, 변수를 초기화하지 않습니다.

  5. 힙 (힙)

  프로그램이 일반 할당을 실행하고 프로그래머가 놓을 때 힙 메모리에만 나타납니다. 프로그램이 프로그램 (예를 들면, 프로세스 등) 후에 메모리를 복구 할 수있다 운영체제를 해제하지 않은 경우의 운영 시스템의 경우에는, 종료한다.

  6. 스택 (스택)

  단지 실행의 함수에서 사용하는 변수, 함수 파라미터를 메모리 스택 및 스택 공간을 사용하여 값을 리턴 스택 공간이 자동으로 할당 컴파일러에 의해 해제된다.

  C 언어 오브젝트 파일의 메모리 레이아웃

  예를 들어 봐 :

  INT의 A = 0; // 글로벌 초기화 영역입니다. 데이터 세그먼트

  정적의 INT B = 20; // 글로벌 초기화 영역. 데이터 세그먼트

  숯의 P1 * // .bss라고 세그먼트 초기화 전체 영역

  CONST INT의 A = 10; //.rodata 段

  메인 공극 (보이드)

  {

  INT의 B; // 스택

  문자 S [] = "ABC"; // 栈

  숯불 *의 P2; // 스택

  정적 INT의 C = O; // 글로벌 데이터 섹션 (고정) 영역 초기화

  숯의 * P3 = "123456", 스택에 상수 지역 // 123456 \ 0, P3.

  P1 = (숯 *)의 malloc (10); // 힙 영역에서 영역 (10, 20) 바이트를 할당 올

  P2 = (숯 *)의 malloc (20);

  strcpy를 (P1, "123456"); 일정한 지역에서 // 123456 \ 0, 컴파일러는 제자리에 "123456"최적화와에 포인트를 P3 수

  }

  코드 세그먼트는, 상기 데이터 세그먼트 판독 전용, 판독 및 데이터 세그먼트 정적 세그먼트 초기화 데이터 영역을 작성하고, 영역이 동적 힙 및 스택이다. 코드 세그먼트는 연결 세그먼트 이후에 생성 된 데이터 세그먼트 읽기 전용 및 판독 - 기록 데이터는 초기화 구간 데이터는 프로그램 초기화 스택과 힙 할당에서 열고 프로그램의 동작을 해제한다. C 언어 프로그램은 두 가지 상태로 구분하고, 런타임 이미지를한다. 컴파일 - 접속 후 형성된 이미지를, 그것은 단지 코드 세그먼트 (텍스트)를 포함, 데이터 세그먼트 (RO 데이터) 읽기 전용 데이터 세그먼트 (RW 데이터)를 작성합니다. 실행하기 전에 동적으로 초기화 데이터 섹션합니다 (BSS)과 같은 동적으로 형성된 스택 (힙)과 프로그램 영역의 실행시에 스택 영역 (스택)를 생성. 일반적으로, 정지 화상 파일, 다양한 부품 (절) 부분이라고하고, 각 부분은 실행 시간 세그먼트 (세그먼트)으로 불린다. 세부 사항은 구별하지 않는 경우, 집합 세그먼트라고도합니다.

  지식 포인트 :

  C 언어는 컴파일 및 링크 된 후, 생성 된 코드 세그먼트 (텍스트), 데이터 세그먼트 (RO 데이터)를 읽기 전용 및 데이터 세그먼트 (RW 데이터)를 작성. 동작에있어서, 상기 세 개의 영역에 더하여, 상기 초기화 데이터 세그먼트 (BSS) 및 더미 영역 (힙) 및 더미 영역 (스택) 영역을 포함하는 방법.

  II : 섹션 C 언어 프로그램

  1 코드 세그먼트 (또는 코드)

  각 기능에 의해 생성 된 코드 세그먼트는, 각 문장의 함수 (컴파일러에 의해 삶과 아키텍처 특정 기계 코드가 결정) 어셈블러를 생성하는 이진 기계 코드를 통해 궁극적으로 해명 할 것이다.

  2. 판독 전용 데이터 세그먼트 (RO 데이터)

  읽기 전용 프로그램에서 사용 된 데이터로부터 유도 된 데이터 세그먼트, 데이터의 부분의 특성이 동작 동안 변경 될 필요가 없다, 컴파일러는 부에 배치 만 데이터 세그먼트를 판독한다. 읽기 전용 C 언어의 전역 변수를 읽기 전용 프로그램에 사용되는 등 로컬 변수, 상수, 컴파일 시간에 판독 전용 데이터 영역에 배치된다.

  참고 : [100] = { "ABCDEFG"} CHAR 글로벌 변수 CONST의 정의, 생성 된 크기는 읽기 전용 데이터 영역을 100 바이트이고, "ABCDEFG"초기화를 사용. 로 정의한다면 : [η] = { "ABCDEFG"} CHAR CONST, 문자열 길이를 8 바이트에 따라 생성 된 판독 전용 데이터 세그먼트 (또한 '\ 0'), 판독 전용 데이터 세그먼트에 있도록 통상 우리는 전체 초기화를 할 필요가있다.

  3. 읽기 및 쓰기 데이터 세그먼트 (RW 데이터)

  대상 세그먼트의 데이터 읽기 및 쓰기가 아니라, 데이터 영역을 기록 할 수 읽을 수있는 파일의 일부를 나타내며, 어떤 경우에 그것들은 또한 읽기 전용 데이터 세그먼트가 속하는 같은 데이터 세그먼트 및 코드 세그먼트의 일부 초기 데이터 세그먼트로 알려져 정적 영역에 프로그램되지만 쓸수의 특성을 갖는다. 정적 숯 B [100] = 함수의 { "ABCDEFG"}의 정의, 프로그램 영역의 데이터를 판독 및 기록한다 특성 초기화된다 : 일반적으로, 글로벌 변수와 로컬 변수를 정적 판독에 넣고 데이터 세그먼트를 작성되고 초기화 만하면되지 초기 값, 기록 데이터 영역은 발생하지 않고, 초기화되지 않은 데이터 영역 (BSS)에 위치한다. (변수의 함수 외부에서 정의) 전역 변수는 단지 파일 내에서 사용될 수 있음을 의미 정적 변형을 추가 한 경우, 다른 파일이 될 수 없다.

  4. 초기화 데이터 세그먼트 (BSS)

  판독과 마찬가지로 데이터 세그먼트를 작성, 이는 정적 데이터 영역이지만 세그먼트 내의 데이터가 초기화되어 있지 않습니다. 실제로 대상 파일을 요구하지 않고 그래서이 부분 만이 실행시에 생성 할 것이다, 대상 파일에서 확인됩니다. 초기화되지 않은 데이터 세그먼트는 작업의 초기화 단계 동안에 만 생성됩니다, 그래서 대상 파일 크기의 크기에 영향을 미치지 않습니다.

  C 언어 프로그램에서 다음과 같은 변수뿐만 아니라, 관심을 지불 할 필요를 사용 :

  함수 본문에 정의 1. 변수 프로그램 이순신위한 처리부의 스택 관리를 수행하는 것이 필요하지 않다.

  2. 함수의 malloc,은 calloc은, realloc을가 할당 메모리와 힙에 할당 된 다른 메모리 공간을 사용하여, 프로그램은 무료 버전의 사용, 또는 메모리 누수가 발생하는지 확인해야합니다.

  3. 모든 시험 관내 기능 배치되는 내부 또는 전체 영역 밖에 있는지 함수의 첨가 후에 전역 변수, 정적 변수를 정의 하였다.

  4. CONST 프로그램의 방전 영역의 변수를 읽기 전용 데이터를 정의.

  세 : 중간에 프로그램을 사용하여

  다음은 간단한 예에서는 C 언어와 세그먼트의 변수들 사이의 대응 관계를 설명한다. 다음 세그먼트의 실제 수에 대응하는 글로벌 존 (무부하 영역)에서 C 언어 프로그램 : RO 데이터, RW 데이터; BSS 데이터.

  변수 초기화는 초기화 된 데이터 영역 (데이터 RW)의 경우 일반적으로, 초기화되지 않은 데이터 영역에 직접 정의 전역 변수가 읽기 전용 데이터 영역 CONST 합친 것이다.

  CONST 숯 RO는 [] = { "에만 데이터를 판독"} // 읽기 전용 데이터 영역

  정적 숯 rw_1 [] = { "이 전역 읽기 쓰기 데이터 인"} // 초기화 데이터 구역을 읽고

  숯 BSS_1 [100]; // 초기화 데이터 섹션

  CONST * CHAR ptrconst = "일정한 데이터"; 판독 전용 데이터 세그먼트 // 문자열

  () 주요 int로

  {

  단, B // 스택은, 2 바이트를 차지하고

  스택 개방 // 100 바이트의 값이 상기 제 주소 A는 [100] 숯불

  문자 S [] = "ABCDEFG"// 스택의 4 바이트, "ABCDEFG"판독 전용 데이터 저장 영역에 자신을 배치하는 8 바이트

  숯의 P1 * 상기 스택 P1 // 4 바이트

  숯의 * P2 = "123456"// 스택 (P2)은, 콘텐츠에 점 (P2)은 변경 될 수 없다 "123456"의 판독 전용 데이터 영역

  정적 숯 rw_2 [] = { "이 로컬 읽기 쓰기 데이터는"} // 초기화 로컬 읽기 및 쓰기 데이터 세그먼트

  정적 숯 BSS_2 [100]; // 로컬 초기화 데이터 섹션

  정적 INT의 C = O; // 글로벌 정적 영역 초기화

  P1 = (숯 )을의 malloc (10 sizeof의 (숯)); // 힙 영역에 메모리 영역을 할당

  strcpy와 (P1, "XXXX")는; // "XXXX"는 읽기 전용 데이터 영역에 5 나타내는 바이트

  무료 (P1); // 무료 메모리를 사용은 P1을 출시 지적

  0을 반환;

  }

  읽기 및 쓰기 데이터 메모리 세그먼트 정적 숯 rw_1 [] 초기화 전역 변수를 포함 로컬 정적 변수 정적 rw_2. []의 차이가 있음을, 함수 내에서 사용되거나 문서에서 사용될 수있다 때 해명. 또는 기록 데이터 영역에 배치되지만, 다른 파일이 참조 될 수 없다거나 정적 변형없이 [] rw_1 들어. 후자의 경우가, 그것은 로컬 정적 변수는 판독되지 정적 변형 경우 영역에 배치 데이터의 의미가 완전히 여기 아니라 정적 변수보다는, 그것을 로컬 변수 스택 공간에 개방한다 변경 물품이며 rw_1 []는 rw_2 [] 구체적인 값은 결정 영역과 동일한 크기의 문자열 길이의 고정 단부를 표시하지 않는다.

  BSS_1 [100] 및 BSS_2 [100]의 초기화되지 않은 데이터 영역은, 전자가 전역 변수 인 것을 제외하고는, 모든 문서들에 사용될 수 있으며, 후자는 로컬 변수, 내부에서만 사용하는 기능이다. 초기화되지 않은 데이터 세그먼트가 초기 값 뒤에 배치되지 이순신 BSS는 길이에 따른 일련의 크기를 증가시킬 필요위한 영역의 크기 값을 지정하는 데 사용되어야한다.

  스택 공간은 주로 다음 세 가지의 데이터를 저장하기 위해 사용된다 :

  1. 함수 내의 동적 변수

  2. 함수 파라미터

  3. 함수의 리턴 값

  동적 스택 공간을 열어 재활용된다. 함수 호출 계층 구조가 더 큰 구조를 사용하는 경우 점차적으로 매개 변수를 전달하는, 증가 값을 반환하는 데 필요한 많은 스택 공간이 경우 통화 기능 중에, 스택 공간의 사용은 비교적 큰 것입니다.

추천

출처blog.51cto.com/14355585/2413971