2015-01-24 4 views
4

은 상황에서 정확히 무슨 일이 일어날 것메모리 할당과 문자 배열

int i = 0; 
for(i; i <100; i ++) 
{ 
    char some_array[24]; 
    //... 
    strcpy(some_array,"abcdefg"); 

} 

some_array 행위 등 :

some_array = malloc(24);

의 시작에서 사이클이 끝나고 free(some_array)?

또는 변수가 스택에 할당되고 함수가 종료 된 후에 종료됩니까? 이 루프의 각 반복의 시작에서 생성하고, 루프의 각 반복의 끝에서 다시 파괴 그래서

답변

7

some_array블록 국부적이다.

간단한 배열의 경우 "생성"과 "파괴"가 그다지 의미하지 않습니다. (C++에서) 생성 및 파손되었을 때 무언가를 출력하는 객체 (예를 들어)로 바꾼다면 그 부작용이 발생하는 것을 볼 수 있습니다.

+0

나는 그것을 이해합니다! 하지만 그것은 프로그램 스택에서 생성 될 것이라는 것을 의미합니까? 아니면 malloc 호출과 같은 동적 인 메모리 할당으로 근본적으로 전환 할 것입니까? – Vanya

+1

@Vanya : 구현에 달려 있지만 일반적인 구현에서는 힙/무료 저장소가 아닌 스택에 있습니다. –

+0

기본적으로 나는 무엇이 더 좋고, 정적으로 char 배열을 가지거나, malloc을 사용하여 메모리를 할당하고, 그 다음에 free'ying을 할 것인지 묻고있다. – Vanya

1

문자열을 저장하는 두 가지 방법이 있습니다. 1. malloc을 사용하여 공간을 만들고 문자 문자열을 저장 이 경우 메모리는 힙에서 할당되며 명시 적으로 해제 할 때까지 해제되지 않습니다. 여기서 메모리도 범위 2. 여기서 메모리 스택에서 할당되고, 도입 암시의 malloc() 또는 무료 통화도 없다

+0

정적으로 할당 된 상수 리터럴도 있습니다. – Deduplicator

+0

어느 것이 더 빠릅니까? 내가 256 바이트가 넘는 문자열을 갖지 않는다는 것을 알고 있다고 가정합니다.루프의 시작 부분에'char file_name [256];'처럼 미리 할당 된 char 배열을 생성하거나'file_name = malloc (256);을 사용하여 매번 메모리를 할당하고 해제한다. free (file_name); ' – Vanya

+0

스택 메모리 (배열 구현)가 힙 (malloc 할당)보다 빠릅니다. 동적 할당은 여분의 결정을 내리는 오버 헤드 인 힙의 위치를 ​​지정하기 위해 포인터를 움직이는 것과 같은 추가 작업을 필요로합니다. 스택 할당은 고정 된 크기입니다. 둘째, 힙에서 할당 된 메모리는 리디렉션이 필요합니다. 스택 작업 공간에서 힙 공간으로 이동해야한다는 뜻입니다. 이러한 문제는 더 높은 수준에서 중요하지 않습니다. 이 속도 차이는 높은 수준의 프로그래밍 – Saisujithreddy

1

범위 후 내재적 해제 배열을 만들고 여기에 저장 한 후 해제되지 예를 보여줍니다.

루프 본문에 "free (some_array)"문을 추가하여이를 입증 할 수 있습니다. 결과는 컴파일 오류가됩니다.

배열은 - 프로그램에 관한 한 - 블록의 시작 부분에서 생성되고 끝에 소멸됩니다. 즉, C 프로그래머는 루프가 반복 될 때마다 C 프로그래머가 작성되고 소멸된다고 가정해야합니다.

배열에서 스택을 만들지 여부 또는 배열을 반복하여 만들고 파괴하는 방법을 컴파일러가 결정합니다. 실제로는 스택에 종종 생성됩니다.

+0

'free (some_array);의 문제로 무시해도됩니다. 컴파일 오류가 발생하지 않습니다. 실행시 문이 발생하면 정의되지 않은 동작이 발생합니다. –

+0

Sorry Mat, 네 말이 맞습니다. – Rob