상세 컨텐츠

본문 제목

(C언어) 문자열 배열에 문자열 대입 불가

개발이야기/C or C++ 언어 관련

by mycatdid0 2022. 10. 12. 15:50

본문

반응형

(포스팅 2022.10.12)

C언어 수업에서 의문이 발생한 점이 있어서 잠깐 설명하고자 합니다.

 

문자열 변수는, 초기화할 당시에 배열로 선언하는 경우가 있고 문자열로 선언하는 경우가 있습니다.

	char strArray[] = "FixedString";		// 문자열배열변수
	char* strPointer = "PointerString";		// 문자열포인터변수

 

아래와 같이, 문자열 배열로 만들어진 변수는, '= 연산자'로 값을 바꾸거나 '++ 연산자'로 값을 변경하는 것이 불가능합니다. 컴파일할 때 에러가 발생합니다.

더보기
int main()
{
	char strArray[] = "FixedString";		// 문자열배열변수
	char* strPointer = "PointerString";		// 문자열포인터변수
	
	printf("strArray = \t%p %s\n", strArray, strArray);
	printf("strPointer = \t%p %s\n", strPointer, strPointer);

	strPointer[0] = 'Z';
	strArray[0] = 'Z';

	strPointer++;

	strArray++;				// 문자열 배열을 수정할 시 에러가 발생함.
	strArray = strPointer;	// 문자열 배열에 문자열 포인터를 대입할 시 에러가 발생함.
	strArray = "NewString"; // 문자열 배열에 문자열을 대입할시 에러가 발생함.
	printf("result = %s\n", strArray);

}

 

에러에서 표시되는 lvalue의 뜻은 아래와 같습니다. (참고링크)

lvalue 는 다른말로 locator value 입니다. object의 위치값이라는 의미입니다.

int a = 10;
이라고 할때, a라는 것은 10이라는 값이 들어있는 공간인 object를 의미합니다.
식별자 a라는 것이 10이 들어있는 object를 표기하기 위해 사용된다고 말할 수 있는 것입니다.

 

컴파일 에러를 보면, "문자열배열인 변수가 lvalue가 아니다"라고 말하고 있습니다. 왜 문자열포인터변수는 lvalue이고 문자열배열변수는 lvalue가 아닌걸까요? 문자열배열변수와 문자열배열포인터는 실제 실행시 아래와 같이 사용됩니다.

 

 

두가지 모두 문자열의 주소를 가리키지만, 다음과 같은 차이가 있습니다.

  • 문자열배열변수는 주소값을 바로 가리킨다.
    문자열 외에 추가메모리를 사용하지 않고, 컴파일시에 문자열 주소로 치환된다.
  • 문자열포인터변수는, 주소값을 가진다.
    즉, 문자열 외에 포인터를 저장하기 위한 공간이 하나 더 생성된다.

따라서, 문자열배열변수는 컴파일 시에 주소값으로 치환되므로, 값을 변경할 수 없어 '++연산자'나 '=연산자'를 사용할 수 없습니다.

 

 

 

포스팅은 여기까지입니다. 

 

언제나 감사드립니다.

반응형

관련글 더보기

댓글 영역