정적 어레이를 분리할 필요가 없는 이유는 무엇입니까?
정적 배열을 해제할 필요가 없는 이유가 궁금합니다.동적 배열을 생성할 때 예를 들어 알고 있습니다.
int *p;
p = malloc(10*sizeof(int));
다음을 사용하여 할당된 메모리를 확보해야 합니다.
free(p);
함수의 정적 배열의 경우 호출된 함수가 완료되면 정적 배열이 자동으로 해제됩니다.
이해할 수 없는 것은 다음과 같은 함수를 사용하여 정적 배열을 반환하는 경우입니다.
int *subFunc(){
static int a[5] = {1,2,3,4,5};
return a;
}
int main(){
int *p;
p = subFunc();
}
실행을 완료한 후 정적 배열이 자동으로 해제되는 경우 정적 배열의 값에 올바르게 액세스하려면 어떻게 해야 합니까?
실행을 완료한 후 정적 배열이 자동으로 해제되는 경우 정적 배열의 값에 올바르게 액세스하려면 어떻게 해야 합니까?
아니요, 그런 거 아니에요.static
됩니다를 됩니다.main()
그리고 그 수명은 프로그램의 전체적인 실행입니다. 그들은서,은이 될 수return
함수들로부터 ed가 (함수들이 정의된) 그리고 여전히 접근할 수 있습니다.함수의 실행이 완료되면 수명이 다 되는 로컬(함수에 대해)이 아닙니다.
에서 ,C11
6. 6.2.4장
없이 입니다.
_Thread_local
또는 인 .static
이 있습니다 .수명은 프로그램의 전체 실행이며 저장된 값은 프로그램 시작 전에 한 번만 초기화됩니다.
A의 범위에 관하여static
§예,§,됩니다 6.2.1됩니다.
[...] 식별자를 선언하는 선언자 또는 형식 지정자가 블록 내부 또는 함수 정의의 매개 변수 선언 목록 내에 나타나면 식별자는 블록 범위를 가지며 관련 블록의 끝에서 종료됩니다. [...]
, 를 할 수 a
으로 subFunc()
,~하듯이a
외부에서 볼 수 없음subFunc()
.
이.return
첫인 FWIW됨).static
배열은 프로그램의 전체 실행이며, 반환된 포인터(surely, 범위 내)에 접근하는 것은 완벽하게 유효하고 합법적입니다.
정적 변수는 정의된 블록이 종료된 후에도 계속 존재합니다.따라서 함수의 정적 변수 값은 동일한 함수에 대한 반복 함수 호출 사이에 유지됩니다.정적 자동 변수의 범위는 자동 변수의 범위와 동일합니다. 즉, 자동 변수가 정의된 블록에 로컬이지만 할당된 저장소는 프로그램 기간 동안 영구적으로 됩니다.정적 변수는 선언문에서 초기화될 수 있지만, 초기화자는 일정한 식을 사용해야 하며, 초기화는 정적 변수에 대해 메모리가 할당된 컴파일 시 한 번만 수행됩니다. - source
해당 함수에서 제어가 나오면 정적 배열 또는 변수가 해제되지 않습니다.
정적 변수의 범위는 선언된 함수에 로컬이지만 수명은 프로그램 전체에 걸쳐 있습니다.
그리고 하위 함수의 정적 배열의 경우 호출된 하위 함수가 완료되면 정적 배열이 자동으로 해제됩니다.
그건 사실이 아닙니다.정적 배열은 함수를 입력할 때 생성되지 않으며, 함수를 종료할 때도 삭제되지 않습니다.
정태 변수, 그리고 그 안의 데이터는 정말 글로벌 변수와 같습니다!함수와 관련된 유일한 것은 이름입니다. (사람들이 변수의 "범위"에 대해 이야기하는 것을 듣게 될 것입니다. 즉, "이름을 어디서 참조할 수 있는지"를 의미합니다.)
따라서 정적 배열의 수명에 대해 생각할 때 정신적으로 다음을 대체할 수 있습니다.
int *subFunc(){
static int a[5] = {1,2,3,4,5};
return a;
}
와 함께
int ONLY_USE_ME_INSIDE_SUBFUNC__a[5] = {1,2,3,4,5}; /* global variable */
int *subFunc(){
int * a = ONLY_USE_ME_INSIDE_SUBFUNC__a; /* a is the same as the global */
return a;
}
그런 다음 프로그램의 다른 사람들이 그 글로벌 변수를 만질 수 없는 것처럼 행동합니다.
정적 배열을 해제할 필요가 없는 이유가 궁금합니다.
(malloc, calloc) 에와 같이 )에 의해 것.
int a[5]
자유를 위해 명시적으로 관리할 필요는 없습니다.(
static int a[5]
로컬 범위 내에서 액세스할 수 있도록 지원합니다(로컬 함수의 후속 호출 사이에 값을 유지합니다).이러한 목적을 위해 컴파일 시간에 생성되며, 프로그램 수명이 있으므로 가능하더라도 자유롭게 하는 것은 논리적으로 고려되지 않습니다.다른 모든 것들은 다른 답변들에서 능숙하게 설명되고 있습니다.
Static variables
함수 내부에서, 일반적으로 함수에 대한 여러 호출을 통해 함수의 범위에 있는 일부 데이터를 유지하는 데 사용됩니다.이들은 main() 이전에 초기화되며, 이들의 수명은 프로그램의 전체 실행과 같습니다.그래서, 만약 그들이 그 기능을 종료한 후에 자유로워졌다면 그것은 말이 되지 않을 것입니다.해제하면 다음에 함수를 호출할 때 참조되지 않기 때문에 충돌이 발생합니다.
언급URL : https://stackoverflow.com/questions/37131659/why-dont-static-arrays-need-to-be-freed
'programing' 카테고리의 다른 글
ng-if가 참인 경우에만 메서드 호출 (0) | 2023.10.14 |
---|---|
C에서 포인터 비교는 어떻게 이루어집니까?같은 배열을 가리키지 않는 포인터를 비교해도 괜찮습니까? (0) | 2023.10.14 |
jquery ajax와 함께 JSON을 PHP에 게시하는 중 (0) | 2023.10.14 |
데이터베이스에서 행 선택(strlen) (0) | 2023.10.14 |
False 열 값에 대한 필터링이 True로 반환됨 (0) | 2023.10.14 |