알고 싶어요 정적 메모리 할당 및 동적 메모리 할당 차이가 뭘까?
이와 함께 모든 예제에서와 대해 설명해 주시겠습니까?
이는 표준 인터뷰 질문:
할당된 메모리 사용 시 () 는 ',' 친구 '와' calloc malloc (). # 39, & # 39 라고도 함), 그것은 때때로 heap& 비록 이 힙 데이터 구조 tufts. 상관이 없다. [< sup> /sup> ref<;;;] [1].
int * a = malloc(sizeof(int));
힙 (heap memory 가 영구 보살피되 'free ()' 입니다. 즉, 변수의 수명입니다 제어할 수 있습니다.
int a = 43;
참고로 유효범위 짓궂군요 일치하지 않을 수도 있다. 범위 내에서, 이 변수는 블록 내에서만 중첩할 기능을 할 수 있는 범위 내에서 전송되었기 선언했다. 또한 여기서 이 메모리는 할당할지 지정되어 있지 않습니다. (Sane 시스템에 대한 것, 또는 레지스터는 스택 (stack) 의 최적화를 위한)
,, 그리고 수명입니다 /sup> *< time< 할당된 dell. 컴파일하십시오 sup> 정적 메모리 은 [수명입니다 프로그램] 의 변수 (http://en.wikipedia.org/wiki/Static_variable). C 에서, 정적 메모리 '정적' 키워드를 사용하여 할당할 수 있습니다. 범위가 이 컴파일 유닛 뿐입니다. 더 흥미로운 사실을 [때 '키워드' 통근자 고려되는지] (http://en.wikipedia.org/wiki/Extern_variable). 이 경우 메모리 할당 '' 통근자 가변입니다 defined 컴파일러와의 일이다. '시' 통근자 가변입니다 declared 컴파일러는 다른 변수를 defined 수 있어야 합니다. 문제가 생길 수 있으며, '실패' 통근자 com/go/4e6b330a_kr 너희가운데 / 정의 / 정의 '정적' 변수 선언할 경우 링크뿐 컴파일 문제가 발생합니다. 파일 범위, static 키워드 선택적입니다 (외부 함수):
int a = 32;
있지만 함수은 범위 (δ1 함수):
static int a = 32;
정확히 말하면, '정적' 이 변수로 통근자 '와' 두 개의 서로 다른 클래스 c 이다.
extern int a; /* Declaration */
int a; /* Definition */
정적 메모리 할당 생각하는 것이 좋습니다 that compiler allocated time 컴파일할 때 아닌 의해 처리됩니다. 예를 들어 컴파일러와의 대용량 데이터 섹션의 바이너리 프로그램을 작성할 수 있습니다 '' 언제 '주소를 메모리에 컴파일됨 로드되었는지 내의 데이터' 프로그램의 세그먼트마다 할당된 메모리를 위치를 활용될 것이라고 말했다. 여기에는 선택함 하는 경우 매우 큰 단점은 컴파일됨 이진 많이 사용하는 정적 메모리. # 39 의 절반에도 못 미치는 커브로부터 생성되는 멀티 기가바이트 it& 쓸 수 있는 이진 코드 행 수십. 또 다른 옵션은 컴파일러의 초기화 코드를 투입할 수 있는 메모리를 할당할 수 있는 프로그램을 실행하기 전에 다른 방법으로. 이 코드를 타겟 플랫폼에 따라 달라집니다. 실제로 사용하는 OS 및 현대 컴파일러에도 결정할 휴리스틱 이러한 옵션을 사용할 수 있습니다. 이 아웃해야 시도할 수 있는 작은 C 프로그램 중 하나를 할당하고 교도관님도요 써서 큰 정적임 어레이입니다 10k, 1m, 10m, 100m, 1G 또는 oracle10g 할 수 있습니다. 대부분의 컴파일러에도, 바이너리 크기에 따라 선형적으로 증가하는 새벽꺼정 크기에 맞춰 특정 지점이 되면 다시 위축될 것으로, 과거 어레이이며 컴파일러를 사용하는 다른 할당일까요 전략이다.
register int meaning = 42;
printf("%p\n",&meaning); /* this is wrong and will fail at compile time. */
현대의 대부분의 컴파일러들은 너보다 더 현명한 선택 할 수 있는 emc. com/go/4e6b330a_kr 넣을 수 없습니다 "라는 의미이다.)
정적 및 동적 할당 - 자동 세 가지 종류가 있다.
, 정적 변수를 위한 프로그램이 시작될 때 해당 메모리를 할당 고말은 할당됩니다. 이 때 만들어진 이 프로그램은 크기가 고정되어 있습니다. 글로벌 변수, 적용되는 범위 안에 있는 '정적' 변수 및 변수 파일에 정의된 검증함 총괄하였습니다.
void func() {
int i; /* `i` only exists during `func` */
}
int* func() {
int* mem = malloc(1024);
return mem;
}
int* mem = func(); /* still accessible */
위 예제에서는 할당된 메모리를 액세스할 수 있음에도 불구하고 여전히 유효하고 함수 종료되었습니다. 완료했으면 메모리, 무료 it 합니다.
free(mem);
Allocation:* 컴파일러는 정적 메모리 할당 선언된 변수는 메모리 공간이 필요합니다. 주소를 사용하여 예약된 연산자입니다 취득됩니다 할당할 수 있으며, 이 주소는 주소 포인터 변수. 대부분의 선언된 변수는 정적 메모리 할당 값을 가지고, 이 방법을 포인터입니다 포인터입니다 가변입니다 정적 메모리 할당 () 로 알려져 있다. 메모리 할당되었는지 컴파일하는 동안 하게하면서요.
It allocation:* malloc () 또는 동적 메모리 같은 기능을 사용하여 동적으로 메모리를 afaq calloc (). 이러한 함수는 동적으로 메모리를 사용할 경우 반환된 포인터 변수 값을 얻기 위해 아싱네트 이러한 함수는 런타임 동안 라시네트 알로카시옹스기모리 는 동적 메모리 할당 등) 으로 알려져 있다.
정적 메모리 Allocation:*
메모리 없음 - 활용도는 있습니다 *
동적 메모리 Allocation:*
, &Amp 차이를 정적 메모리 할당 동적 메모리 할당
이전에 할당된 메모리가 실행 프로그램이 시작됩니다 (컴파일하는 동안). 할당된 메모리가 실행 중에 프로그램였어
아니 메모리 할당 해제를 작업 수행 또는 실행 중에. 메모리 바인딩 확립했습니다 및 파기됨 실행 중에 있다.
Com/go/4e6b330a_kr 거주하리라 있겠느 할당할지. 프로그램 단위 활성인지 때 에 불과하다.
사용하여 구현됩니까 스택 및 진동. 데이터를 사용하여 구현됩니까 세그먼트만.
포인터 변수 액세스을 필요하다. 포인터 동적으로 할당할 필요가 없습니다.
보다 빠른 실행 강조한다. 엑서큐션 비해 느린 정적.
더 많은 메모리 공간이 필요합니다. 적은 메모리 공간이 필요합니다.