메모리가 전역 변수, 정적 변수, 상수 데이터 유형, 로컬 변수 (함수로 정의 및 선언 됨), 변수 (주 함수에서), 포인터를 수행하는 데이터, 힙, 스택 및 코드의 네 가지 세그먼트로 나누어지는 것을 고려하여 및 malloc 및 calloc을 사용하여 동적으로 할당 된 공간이 메모리에 저장됩니까?
나는 그들이 다음과 같이 할당 될 것이라고 생각합니다.
- 전역 변수 ——-> 데이터
- 정적 변수 ——-> 데이터
- 상수 데이터 유형 —–> 코드
- 지역 변수 (함수에서 선언되고 정의 됨) ——–> stack
- 메인 함수에서 선언되고 정의 된 변수 —–> 힙
- 포인터 (예 :
char *arr
,int *arr
) ——-> 힙 - 동적으로 할당 된 공간 (malloc 및 calloc 사용) ——–> stack
나는 C 관점에서만 이러한 변수를 언급하고 있습니다.
C를 처음 접했을 때 내가 틀렸다면 바로 정정하십시오.
답변
당신은 이러한 권리 중 일부를 가지고 있지만 질문을 작성한 사람은 적어도 하나의 질문에 대해 당신을 속였습니다.
- 전역 변수 ——-> 데이터 (올바른)
- 정적 변수 ——-> 데이터 (정확한)
- 상수 데이터 유형 —–> 코드 및 / 또는 데이터. 상수 자체가 데이터 세그먼트에 저장 될 때 문자열 리터럴을 고려하고 이에 대한 참조가 코드에 임베드됩니다.
- 지역 변수 (함수에서 선언되고 정의 됨) ——–> stack (correct)
main
함수 에서 선언되고 정의 된 변수 —–>heap도 스택 (선생님이 당신을 속이려고했습니다)- 문맥에 따라 포인터 (ex :
char *arr
,int *arr
) ——->힙데이터 또는 스택. C를 사용하면 전역 또는static
포인터 를 선언 할 수 있으며이 경우 포인터 자체가 데이터 세그먼트에있게됩니다. - 동적으로 할당 된 공간 (사용하여
malloc
,calloc
,realloc
) ——–>스택힙
“스택”을 공식적으로 “자동 스토리지 클래스”라고합니다.
답변
해당 메모리 세그먼트에 대해 알고 싶은 미래의 방문자를 위해 C에서 5 개의 메모리 세그먼트에 대한 중요한 사항을 작성하고 있습니다.
일부 머리 위로 :
- C 프로그램이 실행될 때마다 일부 메모리가 프로그램 실행을 위해 RAM에 할당됩니다. 이 메모리는 자주 실행되는 코드 (이진 데이터), 프로그램 변수 등을 저장하는 데 사용됩니다. 아래 메모리 세그먼트는 동일한 내용에 대해 설명합니다.
- 일반적으로 세 가지 유형의 변수가 있습니다.
- 지역 변수 (C에서 자동 변수라고도 함)
- 글로벌 변수
- 정적 변수
- 전역 정적 또는 로컬 정적 변수를 가질 수 있지만 위 세 가지가 상위 유형입니다.
C의 5 가지 메모리 세그먼트 :
1. 코드 세그먼트
- 텍스트 세그먼트라고도하는 코드 세그먼트는 자주 실행되는 코드를 포함하는 메모리 영역입니다.
- 코드 세그먼트는 종종 버퍼 오버 플로우 등과 같은 버그를 프로그래밍하여 오버라이드 될 위험을 피하기 위해 읽기 전용입니다.
- 코드 세그먼트에는 로컬 변수 ( C에서 자동 변수라고도 함 ), 전역 변수 등과 같은 프로그램 변수가 포함되어 있지 않습니다 .
- C 구현에 따라 코드 세그먼트에는 읽기 전용 문자열 리터럴도 포함될 수 있습니다. 예를 들어,
printf("Hello, world")
문자열 “Hello, world”가 코드 / 텍스트 세그먼트에 생성됩니다.size
Linux OS에서 명령을 사용하여이를 확인할 수 있습니다 . - 추가 자료
데이터 세그먼트
데이터 세그먼트는 아래 두 부분으로 나뉘며 일반적으로 힙 영역 아래 또는 스택 위의 일부 구현에 있지만 데이터 세그먼트는 힙과 스택 영역 사이에 있지 않습니다.
2. 초기화되지 않은 데이터 세그먼트
- 이 세그먼트는 bss 라고도합니다 .
- 이것은 다음을 포함하는 메모리 부분입니다.
- 초기화되지 않은 전역 변수 (포인터 변수 포함)
- 초기화되지 않은 상수 전역 변수 .
- 초기화되지 않은 로컬 정적 변수 .
- 초기화되지 않은 전역 또는 정적 지역 변수는 초기화되지 않은 데이터 세그먼트에 저장됩니다
- 예를 들어, 글로벌 변수
int globalVar;
또는 정적 로컬 변수static int localStatic;
는 초기화되지 않은 데이터 세그먼트에 저장됩니다. - 당신이 전역 변수를 선언하고 초기화하는 경우
0
또는NULL
다음 여전히 초기화되지 않은 데이터 세그먼트 또는 BSS에 갈 것입니다. - 추가 자료
3. 초기화 된 데이터 세그먼트
- 이 세그먼트는 다음을 저장합니다.
- 초기화 된 전역 변수 (포인터 변수 포함)
- 초기화 된 상수 전역 변수 .
- 로컬 정적 변수를 초기화했습니다 .
- 예를 들어, 글로벌 변수
int globalVar = 1;
또는 정적 로컬 변수static int localStatic = 1;
는 초기화 된 데이터 세그먼트에 저장됩니다. - 이 세그먼트는 초기화 된 읽기 전용 영역과 초기화 된 읽기-쓰기 영역 으로 더 분류 될 수있다 . 초기화 된 상수 전역 변수는 초기화 된 읽기 전용 영역으로 이동하고 런타임시 값을 수정할 수있는 변수는 초기화 된 읽기 / 쓰기 영역으로 이동 합니다.
- 이 세그먼트의 크기는 프로그램 소스 코드의 값 크기에 따라 결정되며 런타임시 변경되지 않습니다 .
- 추가 자료
4. 스택 세그먼트
- 스택 세그먼트 (함수 내부에서 생성되는 변수 저장하는 데 사용되는 함수 또는 메인 함수 사용자 정의 함수일 수 ) 변수 등
- 함수의 지역 변수 (포인터 변수 포함)
- 함수에 전달 된 인수
- 반송 주소
- 스택에 저장된 변수는 함수 실행이 완료되는 즉시 제거됩니다.
- 추가 자료
5. 힙 세그먼트
- 이 세그먼트는 동적 메모리 할당을 지원하기위한 것입니다. 프로그래머가 C에서 동적으로 다음 몇 가지 메모리를 할당하고 싶은 경우는 사용하여 수행됩니다
malloc
,calloc
또는realloc
방법. - 예를 들어,
int* prt = malloc(sizeof(int) * 2)
8 바이트가 힙에 할당되고 해당 위치의 메모리 주소가 반환되어ptr
변수에 저장됩니다 .ptr
변수 중 하나가 사용 / 선언되는 방식에 따라 스택이나 데이터 세그먼트에있는 것이다. - 추가 자료
답변
잘못된 문장을 수정
constant data types -----> code //wrong
지역 상수 변수 —–> 스택
초기화 된 전역 상수 변수 —–> 데이터 세그먼트
초기화되지 않은 전역 상수 변수 —–> bss
variables declared and defined in main function -----> heap //wrong
메인 함수에서 선언되고 정의 된 변수 —–> stack
pointers(ex:char *arr,int *arr) -------> heap //wrong
dynamically allocated space(using malloc,calloc) --------> stack //wrong
pointers (ex : char * arr, int * arr) ——-> 해당 포인터 변수의 크기는 스택에 있습니다.
동적으로 n 바이트의 메모리를 할당 malloc
하거나 ( 또는 사용 calloc
) 포인터 변수를 가리 키도록 만듭니다. 이제 n
메모리 바이트가 힙에 있고 포인터 변수 n
는 메모리 청크 바이트의 시작 포인터를 저장하기 위해 스택에있는 4 바이트 (64 비트 시스템 8 바이트 인 경우)를 필요로 합니다.
참고 : 포인터 변수는 모든 세그먼트의 메모리를 가리킬 수 있습니다.
int x = 10;
void func()
{
int a = 0;
int *p = &a: //Now its pointing the memory of stack
int *p2 = &x; //Now its pointing the memory of data segment
chat *name = "ashok" //Now its pointing the constant string literal
//which is actually present in text segment.
char *name2 = malloc(10); //Now its pointing memory in heap
...
}
동적으로 할당 된 공간 (malloc, calloc 사용) ——–> 힙
답변
널리 사용되는 데스크탑 아키텍처는 프로세스의 가상 메모리를 여러 세그먼트로 나눕니다 .
-
텍스트 세그먼트 : 실행 코드가 들어 있습니다. 명령 포인터는이 범위의 값을 갖습니다.
-
데이터 세그먼트 : 전역 변수 (예 : 정적 링크가있는 객체)를 포함합니다. 읽기 전용 데이터 (예 : 문자열 상수)와 초기화되지 않은 데이터 ( “BSS”)로 세분화되었습니다.
-
스택 세그먼트 : 프로그램 의 동적 메모리, 즉 사용 가능한 저장소 ( “힙”) 및 모든 스레드의 로컬 스택 프레임이 포함됩니다. 전통적으로 C 스택과 C 힙은 반대쪽 끝에서 스택 세그먼트로 성장하는 데 사용되었지만 너무 안전하지 않아 연습이 중단되었다고 생각합니다.
AC 프로그램은 일반적으로 정적 저장 기간을 가진 객체를 데이터 세그먼트에, 자유 저장소에 동적으로 할당 된 객체 및 살아있는 스레드의 호출 스택에 자동 객체를 넣습니다.
구형 x86 리얼 모드 또는 임베디드 장치와 같은 다른 플랫폼에서는 상황이 완전히 다를 수 있습니다.
답변
나는 C 관점에서만 이러한 변수를 언급하고 있습니다.
C 언어 의 관점에서 중요한 것은 범위, 범위, 연결 및 액세스입니다. 항목이 다른 메모리 세그먼트에 정확히 어떻게 매핑되는지는 개별 구현에 달려 있으며 이는 다양합니다. 언어 표준은 메모리 세그먼트 에 대해 전혀 이야기하지 않습니다 . 대부분의 현대 건축은 대부분 같은 방식으로 작동합니다. 블록 범위 변수 및 함수 인수는 스택에서 할당되고 파일 범위 및 정적 변수는 데이터 또는 코드 세그먼트에서 할당되며 동적 메모리는 힙에서 할당되며 일부 상수 데이터는 읽기 전용 세그먼트에 저장됩니다 등
답변
스토리지에 대해 염두에 두어야 할 한 가지는 as-if 규칙 입니다. 컴파일러는 특정 위치에 변수를 배치 할 필요가 없습니다. 대신 컴파일 된 프로그램이 추상 C 시스템의 규칙에 따라 추상 C 시스템에서 실행 되는 것처럼 동작하는 한 원하는 위치에 배치 할 수 있습니다 . 이것은 모든 저장 기간에 적용됩니다 . 예를 들면 다음과 같습니다.
- 모든 것에 접근 할 수없는 변수는 완전히 제거 될 수 있습니다-그것은 어디에도 저장 공간이 없습니다. 예 –
42
생성 된 어셈블리 코드에는 있지만 부호는없는 방법을 참조하십시오404
. - 주소가 자동 저장 기간이 아닌 변수는 메모리에 전혀 저장할 필요가 없습니다. 루프 변수가 그 예입니다.
- 메모리에
const
있거나 효과적으로const
메모리에있을 필요가없는 변수 예 -컴파일러는 그것이 코드에foo
효과적으로const
사용되는 것을 증명할 수 있습니다 .bar
외부 링크가 있고 컴파일러는 현재 모듈 외부에서 변경되지 않음을 증명할 수 없으므로 인라인되지 않습니다. - 할당 된 객체
malloc
는 힙에서 할당 된 메모리에 상주 할 필요가 없습니다! 예 -코드가 어떻게 호출되지 않고malloc
메모리에 값 42가 저장되어 있지 않은지 , 레지스터에 유지됩니다! - 따라서 메모리 가 누출
malloc
될free
필요가없는 객체를 할당 해제하지 않고 할당되고 참조가 된 객체는 손실됩니다 … - 에 의해 할당 된 객체 는 Unixen 에서 프로그램 나누기 ( ) 아래 의
malloc
힙 내에있을 필요가 없습니다 …sbrk(0)
답변
포인터 (ex : char * arr, int * arr) ——-> heap
아니요, 스택이나 데이터 세그먼트에있을 수 있습니다. 그들은 어디든 가리킬 수 있습니다.
