몽상실현개발주의

[따배씨] 11.2 메모리 레이아웃과 문자열 본문

Language/C

[따배씨] 11.2 메모리 레이아웃과 문자열

migrationArc 2021. 6. 9. 17:16

[따배씨] 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

 

실리콘 밸리의 프로그래머 : 네이버 블로그

안녕하세요! 홍정모 블로그에 오신 것을 환영합니다. 주로 프로그래밍 관련 메모 용도로 사용합니다. 강의 수강하시는 분들은 홍정모 연구소 카페로 오세요.

blog.naver.com

http://www.inflearn.com/course/following-c

 

홍정모의 따라하며 배우는 C언어 - 인프런 | 강의

'따배씨++'의 성원에 힘입어 새롭게 개발된 C 언어로 시작하는 프로그래밍 입문 강의입니다. '따배씨'와 함께 프로그래밍 인생을 업그레이드 해보세요., 따라하며 배우는 C언어 '따배씨++'의 성원

www.inflearn.com

 

 

Comments