pianori
57
2019-05-29 22:50:34 작성 2019-05-29 22:52:50 수정됨
2
509

c언어 문자열 포인터변수, 배열 문자열 변수에 관한 질문입니다.


c언어에서

주어진 문자열 중 소문자 -> 대문자로 바꾸는 함수를 만들려고 합니다.

아래와 같이 한번 만들어 봤는데요, 


char	 *ft_strupcase(char *str)
{
  char *s = str;
  while(*s != '\0') {
    if(*s >= 'a' && *s <= 'z') {
        *s = *s - 32;
    }
    ++s;
  }
  return str;
}


여기서 ft_strupcase 함수의 매개변수로 "문자열 배열" 을 넘기면 잘 바뀌는데 

문자열 리터럴을 가리키는 "포인터" 변수를 매개변수로 넘기면 안되는 이유가 뭘까요?


int main(void)
{
  char str1[10] = "aba";
  char *str2 = "aba";

  printf("%s", ft_strupcase(str1)); // 출력 ABA
  printf("%s", ft_strupcase(str2)); // 오류, 바꾸지 않음...
  return (0);
}


포인터 문자열 변수를 매개변수로 넘기면서 바꿀 수 있는 방법은 없는걸까요?


1
  • 답변 2

  • Deer Hunter
    328
    2019-05-30 03:05:06
    char str1[10] = "aba";

    위 코드는 문자열 상수("aba")의 내용을 문자형 배열에 복사합니다.

    그러므로, 문자형 배열의 포인터를 이용하여, 복사된 내용("aba")의 변경이 가능합니다.


    그러나 아래의 코드는 문자열 포인터가 문자열 상수가 위치하는 주소를 가리키게 됩니다.

    char *str2 = "aba";

    그 이후 상기 문자열 포인터를 이용한 변경은 문자열 상수에 대한 변경을 시도하는 것이므로 실패하는 것입니다.

    간단하게 말하자면 바꿀수 없는 상수를 변경하려는 것이 잘못된 것입니다.

  • pianori
    57
    2019-06-01 15:10:44

    친절한 설명 감사합니다!

  • 로그인을 하시면 답변 을 등록할 수 있습니다.