2011년6월17일_const(상수, 읽기전용), 어떤 메모리영역에 위치해 있나?

 

 

   1:  const char *p = "test";          // p를 사용해 test 수정하지 않겠다.
   2:  char * const p = "test";         // p가 test를 가리키는 것을 수정하지 않겠다.
   3:  const char * const p = "test"     // test를 향해 일편단심...

문자열 “test”는  (const char *)형이라 코드영역에 들어간다.
printf( )의 첫 번째 인자도 (const char *)형이다. const가 붙어 있으니 printf( )의 내부에서 첫 인자를 수정하지 않겠다.

char A[0] = “test”; 라 선언하고,
printf(A);
printf( )는 읽기만 하니 가능하다.

const char *p = “test”; 라 선언하고,
사용자정의함수 void print(char *p)에 인자로 넘겨주면 에러다. 포인터변수가 가리키는 곳은 code영역이라 수정불가능한데,
print( )는 인자로 주소를 받아 참조해 수정하면 에러다.

   1:  const char *Text1 = "This is a ATmega";         // 문자열의 코드영역이 어디 있는지 가지고 있음.
   2:                                                  /*코드영역에 문자열 + Text1 포인터변수 4Bytes*/
   3:  char Text2[] = "This is a ATmega";              // Stack영역에 있다.

Text1의 주소 : stack영역
Text1이 가진 주소 : Code영역
Text2의 주소 : stack영역

 

   1:  #include <stdio.h>
   2:   
   3:  int main()
   4:  {
   5:      int a=100;
   6:      char *    Text1     = "This ia a ATMega";
   7:      char     Text2[] = "This ia a ATMega";
   8:   
   9:      printf("main의 주소      : %08X\n", main);
  10:      printf("a의 주소         : %08X\n", &a);
  11:      printf("Text1의 주소     : %08X\n", &Text1);
  12:      printf("Text2의 주소     : %08X\n", Text2);
  13:      printf("Text2의 주소     : %08X\n", &Text2);
  14:      printf("Text1이 가진주소 : %08X\n", Text1);
  15:      return 0;
  16:  }


Text1과 Text2의 주소가 어떤 영역에 있나 확인하기 위해 상기의 소스코드를 컴파일하여 실행하여 보면…

image