2012-10-13 9 views
15

이 질문은 이전에 요청했지만 검색을 통해 찾을 수 없었습니다. 사전에 불편을 끼쳐 드려 죄송합니다.C 배열 인스턴스화 - 스택 또는 힙 할당?

컴파일 타임에 개체의 크기를 알면 스택에만 할당한다는 것은 잘못된 것입니다. 배열을 초기화하는 경우에 그래서, 당신은이 중 하나를 할 수있는 (그리고 이것은 스택에 가야한다)이 배열의 크기는 컴파일 타임에 알려져 있기 때문에

char charArray[50]; 

이 아무 문제가 없습니다.

한편

이 (내가 믿는)도 유효 코드 :

char anotherCharArray[someVariable + 50]; 

이뿐만 아니라 스택에 가시겠습니까? 나는 코드를 segfaults한다고 확신한다. 왜냐하면이 코드를 자유롭게하면 (그렇게) 생각하게 만든다. 그러나 실제로 나에게 의미가 없다. 마찬가지로 데이터가 malloc을 통해 할당되었을 때 free()를 사용해야하는 100 % 유일한 상황입니까?

미리 도움을 주셔서 감사합니다.

+2

@Shookit : 로컬 변수 또는 전역 변수 중 어느 것을 사용할지 지정해야합니다. –

+0

@PaulR 배열이 가변 길이이면 전역 범위에있을 수 없습니다. –

+1

데이터를 저수준 저장하는 * 자동 저장 *과 * 스택 *을 구별해야합니다. 자동 저장 장치에 저장된 데이터는 레지스터와 마찬가지로 다른 위치에 배치 될 수 있습니다. 크기가 알려지지 않은 로컬 배열 (VLA : s라고 함)의 경우 컴파일러는 스택에 배치 할 수 있으며 힙에 메모리를 할당 할 수도 있습니다 (적절한 위치에서 해제 할 때까지). 사실, VLA :는 setjmp/longjmp와 잘 어울리지 않아 누출 될 수 있습니다 (C 표준에서 허용). – Lindydancer

답변

4

마찬가지로 malloc을 통해 데이터를 할당 할 때 free()를 사용해야하는 100 % 유일한 상황입니까?

예. (calloc과 realloc과는 별도로 반환 값은 free() 'd입니다. 마찬가지로 malloc()을 사용하는 함수가 있으며이 사실은 문서화되어 있습니다 (예 : strdup()). 이러한 함수의 반환 값은 다음을 사용하여 해제됩니다. free(), 분명히.)

char anotherCharArray[someVariable + 50]; 

이뿐만 아니라 스택에 가시겠습니까?

예, 그것은 않습니다 (대부분의 구현에 - 물론, 그것은 당신이 생각하는 것이 항상 참 아니지만, 대부분의 플랫폼에서, 그것은이다). 그리고 네 이것은 유효한 코드이지만 C99의 표준입니다.

+0

좋아요, 그래서 가장 큰 오해는 스택 메모리 할당이 컴파일 시간에 크기에 대한 지식을 필요로한다고 가정하고있는 것 같습니다. 나는 이것을 답장으로 표시했다. (하지만 여전히 내 의견에 자유롭게 대답한다.) – Shookit

+6

@Shookit 네, 그건 완전히 잘못된 생각입니다. 알려진 크기를 갖는 것은 무언가가 할당되는 곳과 관련이 없습니다. 유일한 연결은 이전 버전의 C에서 다양한 역사적 이유로'auto' 변수가 알려진 크기를 가져야하고'auto' 변수 만 스택에 할당 할 수 있다는 것입니다. –

+0

@JimBalter가 질문에 매우 잘 답변했습니다. :) –

7

char charArray[50];이 파일 범위 (모든 기능 제외)에 정의되어 있거나 static 인 경우 스택에 없기 때문에 프로그램의 시작 변수에 미리 할당 된 전역이됩니다. static이 아니며 함수 범위에 정의되어 있으면 스택에있을 것입니다.

char anotherCharArray[someVariable + 50];은 기능 범위에서만 정의 할 수 있으며 스택에 있습니다.

위의 모든 사항은 C의 일반적인 구현에 적용됩니다. 비정형 스택은 스택 대신 힙을 사용하고 프로그램의 데이터 섹션에 사전 할당 된 공간 대신 ​​사용할 수 있습니다.

free()malloc(), calloc() 또는 realloc()으로 할당되지 않은 항목. 단순한. 일부 기능은 위의 항목 중 하나의 사용을 의미 할 수 있습니다 (예 : POSIX strdup().

+1

우리가 전역 범위에 있다면'char someArray [variableLenght];'허용되지 않습니다 ... –

+0

@ H2CO3 가장 최근 편집이 모호성을 제거 했습니까? 나는 그것이 글로벌 범위에서 허용되는 것을 암시하는 곳을 보지 못한다. –