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의 주소가 어떤 영역에 있나 확인하기 위해 상기의 소스코드를 컴파일하여 실행하여 보면…