[개발자 로드맵]/C

배열 주소에 증감 연산자 사용은 왜 안될까?

Ramrider 2023. 4. 7. 09:00
728x90
반응형

 

1. 예상되는 상황

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>

int main() {
	char str[32];
	scanf_s("%s", str, 32);

	for (int i = 0; i < strlen(str); i++) {
		printf("%c\n", *str++);
	}

	return 0;
}

 

배열은 포인터로 바꿔 표현할 수도 있으니까 *(str+i)와 같은 형식으로도 작성이 가능하니 *str++해도 될 것 같다고 생각했다. 하지만 위 코드를 실행해보면 *str++에서 컴파일러 오류로 확인된다. 왜그럴까?

 

2. 원인

배열을 포인터 표현으로 바꿔 사용할 때 주의할 점이 있다.

  1. 배열은 컴파일러에 의해 BP를 기준으로 상대적 위치 표현으로 변경되는 문법이다. 따라서 시작 주소가 메모리에 존재하지 않는다. 
  2. BP는 수정을 못하기 때문에 시작 주소 자체를 못 바꾼다. 사실상 상수나 마찬가지다.(주소는 사용 가능하지만 컴파일러가 번역할 때 기계어로 명령어에 쓰이기 때문에 바꿀 수 없다)

*str++는 증감연산자 관점에서 떼어 놓고 본다면 str = str+1과 같은 의미로 주소 값을 변경하겠다는 의미로 오류가 발생한다.

 

참고자료 : https://blog.naver.com/tipsware/222256489228

 

[Q&A] 배열의 주소에 대해

: C 언어 관련 전체 목차 - http://blog.naver.com/tipsware/221010831969 : C 언어 관련 Q&A 목차...

blog.naver.com

 

728x90
반응형