C언어 char * 에러

ROK·2022년 7월 19일
0

계속해서 C를 공부하고 있는데 얼마전부터 거슬리는 에러가 있었다
바로 char *인데

...
char * arr = "Hello, World!";
...

위 코드와 같이 선언을 하면 ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]라는 메세지와 함께 컴파일 에러가 발생한다

const char*로 바꿔주면 된다고 해서 그냥 별 생각없이 쓰던 중 책에 있는 예제를 타이핑하다가 또 마주하게되서 좀 제대로 찾아보게 되었다.

C/C++

이러한 에러는 gcc로 컴파일 했을 때는 발생하지 않지만, g++로 컴파일 했을때 발생한다고 한다.

그 이유는 C의 경우는 업데이트가 늦지만 C++은 비교적 빠르기 때문이라고 한다.

왜 에러가 발생하는가??

에러가 발생하는 이유는 문자열 상수이기 때문이다.
문자열 상수는 const char* 형식으로 작성하는 것이 맞다.

왜냐하면 문자열 상수는 프로그램을 컴파일하고 실행하면 문자열 상수를 변경하는 것이 불가능하기 때문이다.

그렇기 때문에 변경할 수 없음을 알리는 const를 사용하는 것이 맞는 문법이다.

왜 이제는 안되는가??

이전 C/C++ 컴파일러는 개발자가 문자열 상수를 편하게 사용할 수 있도록 const char *형식 이외에 char * 형식도 사용할 수 있게 허용했었다.

그 이유는 아래 코드와 같이 문자열 상수를 const char *형식으로만 사용한다면 print 함수에 문자열 상수를 인자로 사용할 경우 char * 형식으로 형 변환(casting) 해야하는 불편함이 있기 때문이다.

#include <stdio.h>

void Print(char * str) {
	printf("%s \n", str);
}

int main() {
	Print((char *)"hello, world!");
	return 0;
}

이는 C++에서 나같은 초보 개발자들을 위해서 바꾸는 중이라고 한다.

그 이유는 앞서 설명했던 것처럼 문자열 상수는 변경이 불가능하지만 실수로 변환하려고 하면 프로그램을 실행할 때, 메모리 쓰기 접근 위반이 발생하는데 이런 문제가 컴파일할때 에러로 나타나지 않기 때문에 문제를 찾아내기가 어렵다는 문제가 있다.

char * str = "Hello, World!";
*str = 'Y';
// 쓰기 접근 위반 오류 발생, 컴파일 오류 없음

const char * str = "Hello, World!";
*str = 'Y';
// 컴파일 오류 발생

결론

이제는 char * 선언은 안되니 const char *를 사용하는 걸로 하자

** 참고로 const로 선언하면 매개변수도 const까지 붙여줘야 한다.

이 글은 프로그래머 김성엽님의 블로그를 참조하여 작성했습니다.

profile
하루에 집중하자

0개의 댓글