Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- JavaScript
- String
- DP
- udemy
- programmers
- greedy
- 백준
- Python
- Algospot
- 따라하며 배우는 C언어
- 인프런
- graph
- C
- BASIC
- server
- BFS
- dfs
- BOJ
- php
- 따라하면서 배우는 C언어
- Cleancode
- Math
- C언어
- 종만북
- 따배씨
- 생활코딩
- web
- 정수론
- Algorithm
- sorting
Archives
- Today
- Total
몽상실현개발주의
[따배씨] 11.2 메모리 레이아웃과 문자열 본문
따배씨 - 따라하며 배우는 C언어
11강 문자열 함수들
11.2 메모리 레이아웃 Memory Layout 과 문자열
char arr[] = "Hello, World";
char* str = "Hello, World";
//str[0] = 'M'; // Error
- 메모리 레이아웃에서 문제 발생
- 환경변수 : 프로그램이 실행되는 환경에 대한 변수
- Stack : 지역변수들이 저장됨, 메모리의 크기를 Compiler 가 미리 예측할 수 있는 경우에 사용, Compiler 가 준비를 할 수 있기 때문에 처리 속도가 빠름
- Heap : 메모리 공간을 알 수 없을 때 사용
- Segment : 읽기 전용 메모리, 메모리 공간의 변화 불가
#include <stdio.h>
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 arr1[] = "I am a String!.";
const char arr2[] = "I am a String!.";
const char arr3[] = "I am a String!!.";
printf("rodata row \t%llu %llu %llu %llu\n",
(unsigned long long)pt2,
(unsigned long long)pt3,
(unsigned long long)pt4,
(unsigned long long)"I am a String!.");
// rodata row 4294983504 4294983504 4294983474 4294983504
printf("stack high \t%llu %llu %llu\n",
(unsigned long long)arr1,
(unsigned long long)arr2,
(unsigned long long)arr3);
// stack high 140732920755232 140732920755216 140732920755184
return 0;
}
(unsigned long long)pt2 // "I am a String!."
(unsigned long long)pt3 // "I am a String!."
(unsigned long long)pt4 // "I am a String!!."
(unsigned long long)"I am a String!."
- pt2, pt3, "I am a String!." 은 모두 같은 주소값
- Compiler 가 프로그램의 크기를 줄이기 위해 같은 문자열이 여러번 사용 될 때, 하나의 주소값에 저장해서 처리
const char arr1[] = "I am a String!.";
const char arr2[] = "I am a String!.";
const char arr3[] = "I am a String!!.";
- Array 로 선언 했을 경우, 배열 자체가 메모리를 확보해 선언되었기 때문에 다른 메모리 주소를 갖게 됨
#include <stdio.h>
int main(){
const char* pt2 = "I am a String!.";
const char* pt3 = "I am a String!.";
printf("Stack high \t%llu %llu %llu\n",
(unsigned long long)&pt2,
(unsigned long long)&pt3);
// Stack high 140732920755248 140732920755240
return 0;
}
- &pt2, &pt3 는 포인터 변수의 주소값이므로, 주소 값이 다름
#include <stdio.h>
void test_function(){
int j;
printf("Stack high \t%llu\n", (unsigned long long)&j);
}
int main(){
int i;
printf("Stack high \t%llu\n", (unsigned long long)& i);
// Stack high 140732920755228
test_function();
// Stack high 140732920755256
return 0;
}
- 지역 변수는, Stack 메모리 메모리에 저장
- 높은 주소값
#include <stdio.h>
#include <stdlib.h>
int main(){
char* p5 = (char*)malloc(sizeof(char)*100);
printf("Heap middle \t%llu\n", (unsigned long long)p5);
// Heap middle 4301556928
char* p6 = (char*)malloc(sizeof(char) * 100);
printf("Heap middle \t%llu\n", (unsigned long long)p6);
// Heap middle 4301557040
return 0;
}
- 동적 할당된 변수는, Heap 메모리 영역에 저장
- 중간 정도의 주소값
char* word = "Google";
// world[2] = 'o'; // Runtime Error
- 문자열을 포인터로 선언 할때, 문자열의 조작을 메모리 주소로 접근 하는것이 Error를 야기 시킴
- 문자열을 포인터로 선언 할때, 수정이 불가능 하도록 하자
const char* word = "Google"
- 수정을 위해 접근시, Compile Error 발생
- Compiler 가 처리 해줌
이 글의 모든 사진과 내용의 출처는 홍정모 교수님께 있음을 알려드립니다.
http://blog.naver.com/atelierjpro
http://www.inflearn.com/course/following-c
'Language > C' 카테고리의 다른 글
[따배씨] 11.4 문자열을 입력받는 다양한 방법들 (0) | 2021.06.09 |
---|---|
[따배씨] 11.3 문자열의 배열 (0) | 2021.06.09 |
[따배씨] 11.1 문자열을 정의하는 방법들 (0) | 2021.06.09 |
[따배씨] 10.18 복합 리터럴과 배열 (0) | 2021.06.08 |
[따배씨] 10.17 변수로 길이를 정할 수 있는 배열 (VLAs) (0) | 2021.06.08 |
Comments