관리 메뉴

IT 컴퓨터공학 자료실

중급편 1. 초기화 문자열, 2개의 정의 본문

컴퓨터공학/포인터

중급편 1. 초기화 문자열, 2개의 정의

윤맨1 2015. 6. 30. 11:15

                                        포인터 토대가 된 책

                                   초기화 문자열의 2 개의 정의

지금까지도 "문자열"라는 데이터 오브젝트는 다양한 곳에서 사용왔다. 그러나 그 정의는 직관적 인 것으로 끝 마치고오고있다. 여기서 문자열의 정확한 정의한다. 문자열과 포인터이다.

예를 들어 익숙한 표현

        printf ( "Hello, world \ n");
(프로그램 1-1)

문자열 "Hello, world \ n" 포인터에 다름 없다. 왜냐하면 printf ()의 프로토 타입은 int printf (const char * format, ...);로서, 제 1 인수는 char *이다. 것은 이러한 문자열은 그 자체 포인터 인 셈이다. 이 같은 큰 따옴표로 둘러싸인 표현되는 문자열을 단순한 char *과 구별하여 "문자열 리터럴"라고 부르기로한다.

문자열 리터럴은 단순히 포인터뿐만 아니라 그것이 표현하는 문자열의 byte 패턴을 어딘가에 가지고 있고, 그 어딘가의 주소를 포인터 값으로 가지고있는 것이다. 그 장소는 2 가지 가능성이있다. 이를 구분하기 위해 다음의 두 초기화 선언을 보자.

char str1 [] = { "Hello, world \ n"};
char * str2 = "Hello, world \ n";
(프로그램 1-2)

이 두 초기화 선언은 실질적으로 거의 차이가없는 것으로 보인다. str1 문자열의 시작 주소이며, str2도 또한 같다. 그러나 같은 것은 명백한 것이다. 왜냐하면 str1이있는 배열을 대표하고있는 배열의 시작 주소로 직접 번역된다. 그러나 str2는 포인터이며, 포인터로 자신의 주소가 있고 값으로 문자열이 저장되는 위치 주소를 가지고있다. 이 차이를 분명히하려고한다면 다음의 코드를 컴파일 해 보면 좋다.

        char * test = "other world \ n";
        str1 = test;   / * 컴파일 에러 * / 
        str2 = test;   / * 컴파일이 성공하는 합법적 구문 * /
(프로그램 1-3)

즉, str2는 포인터이므로 포인터의 값으로 어딘가의 주소를 가질 수 있으니까 다른 주소를 할당 할 수 있기 때문이다. 그러나 str1 배열의 시작 주소로 직접 번역되는 것이며, 실체적인 배열을 대표하는 상징이다. 그래서 그야말로 0 = test;의 요령으로 정수로 값을 대입하는 것과이며, 이런 일은 할 수 없다.

여기서 용어를 도입한다. "우변 값」과 「좌변 값"이다. 즉, 대입 식의 좌변에 나타날 수있는 값 (할당 할 수있는 값)을 좌변 값이라고 대입 식의 우변에 나타날 수있는 값을 우변 값이라고 부른다. 그래서, 0, 100L, 0.1243과 같은 일반적인 수치 (숫자 리터럴)는 우변 값이 될 수도 좌변 값이 될 수 없다. 문자열 리터럴도 마찬가지이다. 그러나 보통 변수 이름은 모두 가능하다.

그러나 배열 이름은 우변 값이 될 수도 좌변 값이 될 수 없다. 왜냐하면 그것은 수치 인 주소 자체 인 것이지 대입 가능한 변수가 아닌 것이다. 이 차이는 배열로 선언 된 것은 실체적인 배열 한 것이지 포인터라는 단순한 별명이 없다는 차이가 있기 때문이다.

그래서 포인터를 사용하는 경우 최대 조언으로 포인터처럼 취급되고있는 것이 실체인지, 단순한 별명인지를 프로그래밍에서 분명히 인식하면서 사용하는 것이 사실 요구 있는 것이다. 즉, 포인터로 선언 된 변수는 단단히 먼저 초기화 실체를 제대로 가지고있는 실체의 주소를 할당 한 다음 사용 나가는 것을 유의하여야한다. 현실에 포인터와 가장 많은 버그는 초기화 작동 기억이다.

현실적으로는 반면 차이점이 프로그램 1-2의 초기화에있다. 정말 문자열의 패턴이 확보되는 장소의 차이이다. 배열에 의한 초기화의 경우에는 데이터 세그먼트 (DS)에 보통대로 배열이 확보되어, 그 배열의 내용이 문자열의 패턴에 의해 초기화된다. 그러나 포인터에 의한 초기화의 경우에는 보통 DS 문자열의 이미지가 확보되는 것이 아니라 "const 영역」이라고 불리는 특수한 데이터 세그먼트에 확보된다. 이 "const 영역"는 읽기만 가능한 데이터 임에도 불구하고 변경할 수없는 (또는 변경해서는 안거야) 데이터로 예약되어있는 특수 데이터이다. OS에 따라 "const 영역"은 CPU의 권한 설정은 변경하려고하면 세그멘테이션 폴트를 일으키게되어있는 경우도 있고, 또는 데이터 임에도 불구하고, 코드 세그먼트 (CS) 에 배치되도록 할 수도있다. 그래서 포인터에 의한 초기화가 이루어지고있는 문자열은 결코 변경하려한다. 반대로 배열에 의한 초기화가 이루어지고있는 문자열은 변경 가능하다. 그러나 확보 된 배열의 크기를 초과하지 않도록 충분한주의가 필요하다. 문자열 strlen ()에 의한 길이 +1 크기의 배열이 확보되어 있다는 점에 유의해야한다. 1 개 정상은 종료 마커의 0x00 분이다.