(포스팅 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가 아닌걸까요? 문자열배열변수와 문자열배열포인터는 실제 실행시 아래와 같이 사용됩니다.
두가지 모두 문자열의 주소를 가리키지만, 다음과 같은 차이가 있습니다.
따라서, 문자열배열변수는 컴파일 시에 주소값으로 치환되므로, 값을 변경할 수 없어 '++연산자'나 '=연산자'를 사용할 수 없습니다.
포스팅은 여기까지입니다.
언제나 감사드립니다.
C언어) scanf_s로 문자형 받을 때 발생하는 오류 (0) | 2022.10.14 |
---|---|
(C언어) 왜 전역변수만 자동으로 초기화되는가 (0) | 2022.10.12 |
(C언어) scanf와 fgets 함수를 같이 사용하면 입력 오류 발생 (0) | 2022.10.11 |
(C언어) ARRAY_SIZE()로 배열크기 측정 시 유의점 (0) | 2022.10.07 |
NULL을 사용하는 이유 (2) | 2022.10.05 |
댓글 영역