char* 의 초기값 관련해서 궁금합니다.
글쓴이: 호기심천국 / 작성시간: 화, 2018/06/12 - 3:10오후
char* str; str = malloc(512); str[0] = '1'; str[1] = 0x0; printf("%s", str);
char* str = "2"; str[0] = '1'; str[1] = 0x0; printf("%s", str);
char* 형은 문자열 상수로 수정이 안되는 것으로 알고있는데요
위 첫번째 코드는 사실 수정?이 일어났는데도 정상적으로 출력이 가능하고 두번째 코드는 오류가 발생합니다.
두번째 코드에서 두번째 라인에 str = malloc(); 을 해주면 첫번째 코드처럼 1이 출력되지만, 당연히 초기 값인 2는 사라지더군요.
realloc을하면 역시 오류가 발생합니다.
결국 초기값을 주느냐 안주느냐에 따라서 다른것 같은데, 정확히 어떤점이 다른지 알고싶습니다.
(bss영역, data영역에 기록되는 차이때문인가요?)
Forums:
char* 형은 문자열 상수로 수정이 안되는 것으로
char* 형은 문자열 상수로 수정이 안되는 것으로 알고있는데요
-> 이게 잘못되었습니다
str은 그냥 변수입니다
변수의 type이 int냐 double이냐 이런거로 구분하시면 됩니다
"2" 이게 교재에 나와있는 리터럴이고 수정하시려고 하면 안됩니다
궁금한게 하나 더..
감사합니다. "2"가 리터럴이었다고 하니 궁금했던 부분 대부분이 해결되네요.
그런데 추가적으로 궁금한게있습니다.
str[] = "2" 인 경우에도 결국 "2"가 리터럴이라면 수정 불가능해야 할 것 같은데
str[] = "2"로 선언한 후에, str[0]을 수정 가능한 이유는 뭔지 알려주실 수 있나요?
char str[] = "2";는 사실 char
char str[] = "2";
는 사실char str[2] = {'2', '\0'};
와 같습니다.겉보기에는 literal처럼 보이지만 실제로는 그렇지 않고 그냥 배열 초기값을 주었을 뿐인 것이죠. 딱 이 경우에만 적용되는 규칙입니다.
웬 프로그래밍 언어에 이렇게 일관성 없는 문법이 있느냐고 생각할 수도 있지만... 문자 배열의 초기화는 C언어 프로그램에서 빈번하게 일어나는 일이고, 아무래도 shortcut이 있을 필요는 있었겠죠.
그럼에도 불구하고 언어 문법을 공부하려는 사람들에게 혼동을 유발한다는 사실을 부정할 생각은 없습니다.
감사합니다.
궁금한점 해결해주셔서 감사합니다~!
str[] = "2"로 선언한 후에, str[0]을
str[] = "2"로 선언한 후에, str[0]을 수정 가능한가요? 안될것 같은데요?
제 환경에서는 정상적으로 수행되네요
제 환경에서는 정상적으로 수행되네요
gcc version 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC)
아 char str* = "2" 가 아니었군요.
아 char str* = "2" 가 아니었군요.
댓글 달기