C언어 - 메모리 레이아웃과 문자열 (Memory Layout )
2020. 11. 12. 17:11ㆍ개인공부/C언어
지역변수들이 stack에 쌓인다. 컴파일러가 미리 크기를 알수 있다면 미리 준비를 할수있다.
메모리 크기가 얼마될지 예상이 안될경우 heap이라는 메모리를 사용한다.
초기화된 전역/정적 변수들은 변수들이 어떻게 초기화가 되어야 할지를 미리 알고있다.
컴파일할때 이미 결정되어있기 때문에, 프로그래밍 한 값으로 바로 값이 결정됨
초기화되지 않은 전역/정적 변수들은 0으로 초기화.
arr배열자체가 메모리를 가지고 있으니 값을 얼마든지 바꿀수있음.
char* str = "Hello, World"; str 포인터는 "Hello, World" 스트링 리터럴이 저장되어 있는 공간을
바꿀 방법이 없다.
문자열 리터럴들은 컴파일때 이미 값이 정해져있다. 읽기 전용으로 들어감.
읽기전용에서 쓰기를 시도하니 운영체제에서 막아버림
char* word = "Google"; 같은 경우
Test Segment에 들어가있으니 읽기전용으로 들어간것이다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void test_function() {
int j;
printf("Stack high \t%llu\n", (unsigned long long) & j);
}
int main() {
//const char* pt2 = "I am a string!.";
//const char* pt3 = "I am a string!.";
//const char* pt4 = "I am a string!!!!!!!.";
//const char ar1[] = "I am a string!.";
//const char ar2[] = "I am a string!.";
//const char ar3[] = "I am a string!!.";
//printf("rodata low \t%llu %llu %llu %llu\n",
// (unsigned long long)pt2, //9534412
// (unsigned long long)pt3, //9534412
// (unsigned long long)pt4, //9534672
// (unsigned long long)"I am a string!."//9534412
//);
////rodata low 9534412 9534412 9534672 9534412
//printf("Stack high \t%llu %llu %llu\n",
// (unsigned long long)ar1,
// (unsigned long long)ar2,
// (unsigned long long)ar3
//);
////Stack high 13892520 13892496 13892468 40834921267270437
//// * Memory address check *//
///* Local variables */
//printf("Stack high \t%llu %lu %llu\n",
// (unsigned long long) & pt2,
// (unsigned long long) & pt3,
// (unsigned long long) & pt4
//);
//int i;
//printf("Stack high \t%llu\n", (unsigned long long) & i);
////Stack high 9698076
///*Local variable in a function*/
//test_function();
////Stack high 9697824
///* Dynamic allocation */
//char* p5 = (char*)malloc(sizeof(char) * 100);
//printf("Heap middle \t%llu\n", (unsigned long long)p5);
////Heap middle 15227040
//char* p6 = (char*)malloc(sizeof(char) * 100);
//printf("Heap middle \t%llu\n", (unsigned long long)p6);
////Heap middle 15245888
//pt2++;
////am a String.!; 1칸 늘어나서 앞에 한칸 빠짐.
const char* str1 = "When i was young";
const char* copy;
copy = str1;
printf("%s %p %p\n", str1, str1, &str1);
//When i was young 0019845C 004FFED4
printf("%s %p %p\n", copy, copy, ©);
//When i was young 0019845C 004FFEC8
return 0;
}
출처 : 홍정모의 따라배우는 C언어
'개인공부 > C언어' 카테고리의 다른 글
C언어 - 객체(Object)와 식별자(Identifier) , L-value R-value (0) | 2020.11.12 |
---|---|
C언어 - 메모리 레이아웃 훑어보기 (0) | 2020.11.12 |
C언어 - 문자열을 정의 하는 방법 (0) | 2020.11.12 |
C언어 - 복합리터럴과 배열 ( Compound Literals ) (0) | 2020.11.12 |
C언어 - 포인터의 호환성(Compatibility) (0) | 2020.11.12 |