특정 영역(아마 BSS)에 "bbcde"라는 문자열을 보관해 놓고
프로그램 구동시에 string에 위 특정 영역의 번지를 대입해 놓습니다. 근데 문제는 그 특정영역이라는 곳이 프로그램 내에서 변경할 수 없는 영역이라는 것이지요.
그래서 그 영역을 수정하려는 모든 동작은 segmentation fault 를 발생시킵니다.
마찬가지로 int val[5] = {1, 2, 3, 4, 5};
라는 문장이 있다면 역시 컴파일러는 1, 2, 3, 4, 5를 특정영역에 보관시켜 놓고 프로그램 구동시에 1이 들어있는 주소의 값을 불러와 val[0] = 1, ... , val[4] = 5 이런 식으로 초기화 합니다. 즉 1이라는 값은 특정 영역 어드레스에 보관되어 있죠. 그런데 우리는 1이 담겨 있는 주소의 값을 바꾸려고 하지 않기 때문에(사실은 바꿀수도 없음) 이런 사실을 잘 모르게 되죠.
만약 char string[6] = "bbcde"; 라고 한다면 뜻한대로 동작할 겁니다.
한번 아래의 주소를 각각 찍어 보세요.
char *string1 = "bbcde";
char string2[6] = "bbcde";
printf("address %p of string1, address %p of string2\n", string1, string2);
"" 와 ''의 차이는 마지막에 널문자가 들어가나 안들어가나의 차이라고 봐도 될까요?
그래서 포인터로 생각했을 때 널문자를 통해 전체 문자열을 알 수 있는 것이고..
''의 경우는 char에서 배열 하나에만 넣을 수있는 거같아요...아마도?
그래서 ''로 넣어주려면
char a[i] = 'a';
이게 맞는것인가요? 저도 초보라 잘 모르겠네요...
string 이라는 포인터가 가리키는 곳에는
string 이라는 포인터가 가리키는 곳에는 "bbcde" 라는 문자열 상수가 들어 있습니다
문자열 상수는 상수이기 때문에 변경할 수 없는데요
그곳을 test 함수에서 'a' 로 바꾸려고 하니 에러가 발생한 거네요
"그때의 두려움을 어찌 잊을 수 있으리오!"
왕이 말했다.
"하지만"
여왕은 말을 이었다.
"메모해 두지 않으면 잊고 말 겁니다."
사실 이런 문제는 컴파일러가 어떻게 프로그램을
사실 이런 문제는 컴파일러가 어떻게 프로그램을 만드느냐를 알아야 파악할 수 있습니다.
컴파일러는 아래 문장을 만나면
특정 영역(아마 BSS)에 "bbcde"라는 문자열을 보관해 놓고
프로그램 구동시에 string에 위 특정 영역의 번지를 대입해 놓습니다. 근데 문제는 그 특정영역이라는 곳이 프로그램 내에서 변경할 수 없는 영역이라는 것이지요.
그래서 그 영역을 수정하려는 모든 동작은 segmentation fault 를 발생시킵니다.
마찬가지로 int val[5] = {1, 2, 3, 4, 5};
라는 문장이 있다면 역시 컴파일러는 1, 2, 3, 4, 5를 특정영역에 보관시켜 놓고 프로그램 구동시에 1이 들어있는 주소의 값을 불러와 val[0] = 1, ... , val[4] = 5 이런 식으로 초기화 합니다. 즉 1이라는 값은 특정 영역 어드레스에 보관되어 있죠. 그런데 우리는 1이 담겨 있는 주소의 값을 바꾸려고 하지 않기 때문에(사실은 바꿀수도 없음) 이런 사실을 잘 모르게 되죠.
만약 char string[6] = "bbcde"; 라고 한다면 뜻한대로 동작할 겁니다.
한번 아래의 주소를 각각 찍어 보세요.
주소의 위치가 좀 다를 거예요.
제가 알기로는 이런데.. 이게 맞나요?
"" 와 ''의 차이는 마지막에 널문자가 들어가나 안들어가나의 차이라고 봐도 될까요?
그래서 포인터로 생각했을 때 널문자를 통해 전체 문자열을 알 수 있는 것이고..
''의 경우는 char에서 배열 하나에만 넣을 수있는 거같아요...아마도?
그래서 ''로 넣어주려면
char a[i] = 'a';
이게 맞는것인가요? 저도 초보라 잘 모르겠네요...
감사합니다.
두 문장이 같은 문장이라고 생각해고 있었는데 아니군요
첫 번째 문장은 string1 포인터가 "bbcde"라는 상수를 가리키도록 하는 것이다.
두 번째 문장은 string2 배열 공간에 "bbcde"를 넣어주는 것이고
그래서 첫 번째 문장으로 초기화를 하고 수정을 하려고 하면 에러가 발생하는 군요.
하나 배우고 가네요 .ㅜ 감사합니다.
전왜 잘되죠? 아무 에러도 안남
맞는 문법인거 같은데
댓글 달기