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, &copy);
	//When i was young 0019845C 004FFEC8


	return 0;
}

 

 

 

 

 

 

출처 : 홍정모의 따라배우는 C언어