|
안녕하세요. 다음 func() 호출때부터 abc가 zbc로 나오는 이유는 char *str = "abc" 로 정의한데 있습니다.
"abc"라는 문자열로 소스내에 지정하였기때문에 컴파일시 이 "abc" 라는, 이런 종류의 문자열들이 모여있는 데이터 그룹내에 있게됩니다. 이 데이터그룹안에는 printf("Hello!");에서 Hello! 같은 문자열 등이 위치해 있어서 printf 호출 전에 이 데이터그룹 내의 Hello!문자열의 주소를 printf에 넘겨주는 것이지요.
*str = "abc" 에서 이 "abc"도 이 데이터그룹내에 "abc"로 들어가 있으며 *str은 새로 메모리를 할당받아 "abc"를 넣는것이 아닌 데이터 그룹내의 "abc"위치를 가리키고 있게 됩니다. 첫번째 함수 호출에서 zbc로 바꾸게 되면 데이터 그룹내의 "abc"가 zbc로 바뀌게 되며 두번째 호출때는 str이 데이터 그룹내의 "zbc"를 가리키게 되어 zbc로 출력되는 것입니다.
정리하자면 char *str = "abc" 의 의미는 str에 새 주소를 할당한 후 문자열 "abc"로 초기화하는 것이 아니라 컴파일될때 이미 데이터 그룹내에 "abc"를 위치하게 하여, char *str = "abc"라는 코드가 컴파일 될때는 데이터그룹 내의 "abc"를 가리키게 컴파일된다는 것입니다.
첫번째에 질문하신 데이터 영역 침범에 관한 것도 이 "abc"가 데이터 그룹내에 있다는 사실을 알게되면 왜 위험한지 아실것입니다. 데이터 그룹내에는 이렇게 소스 코드내에 지정된 문자열들이 줄줄이 붙어 있습니다. 만약 char *str = "abc"로 정의한후 str에 "abc" 길이 이상의 문자열을 넣게 되면 다른 문자열 위에 덮어씌우게 되며, 만약 다른 문자열의 NULL문자까지 덮어씌우면 이 문자열을 사용하는 함수가 NULL문자를 찾지 못해 Access Violation 이 나오게 될 소지도 있습니다.
Builder MySelf 님이 쓰신 글 :
: : 처음 func()를 호출하면.. Edit1에 abc라고 출력한다음에 str의 문자열의 첫번째 문자를 'z'로 바꾸게 되니깐. 두번째 func()를 호출 하면 zbc라고 나오죠..
: :
: : 이건 배열과 포인터가 같은 주소공간을 가르키고 있다는 설명을 하는겁니다.
: : 다시 말해서 *str 이랑 str[0] 동일한 주소공간을 가르키는 거구요
: : *(str + 1) , str[1] 하고 같고
: : *(str + 2), str[2] 하고 같다는 말이죠..
: :
: : 다시말하면 str 이란 변수에는 abc문자열의 첫번째 문자 'a'가 저장된 위치의 주소값을 가지고 있는겁니다.
: : str + 1 은 주소값을 1 증가 시키는 결과니깐 'b'문자의 주소값이 되는거죠.
:
: 영준님께서 말씀하신것 중에 이상한 점은
:
: 분명 다음 func()를 콜 하면 다시 변수를 선언 한다는것이죠...
:
: char *str = "abc";
:
: 다시 abc가 되야 맞는 말입니다... 다만 현재 static변수처럼 행동하고 있다는것이 문제 이지요...
:
: 영준님께서 설명하신 포인터 연산하고는 약간 다른 문제가 아닌가요??
|