TIL
230704 TIL C언어 컴파일 과정 배열(문자열) 크기 오류
bunbun2
2023. 7. 4. 13:52
문자열 선언 시 참고할 점
char a[10] = "abcd";
int length= strlen(a);
char c[length]= "abcd";
1번째 줄은 문제없이 잘 되지만,
4번째 줄에서는 오류가 발생한다.
length를 정수형으로 분명히 할당을 해주었는데 왜 오류가 나는거지?
해결법은 길이를 자동지정하도록 c[] 이런식으로 선언하는 방법이 있는데,
오류가 나는 원인을 근본적으로 이해하기 위해 정리해봄
gpt형에게 물어본 결과
C언어에서 배열(문자열)을 선언 할 때,
컴파일 타임에 배열의 길이에 맞는 메모리 크기를 할당하기 때문에
동적할당이 아닌 일반적인 선언 방법(정적할당)에서는
배열의 길이가 변하지 않는 상수 라는것을 보장 받아야만 하는 것임!
절차지향 언어인 C언어에서는
배열의 크기를 할당한 뒤, 변수의 값을 읽어오기 때문에 문제가 생김!
- 소스 코드 작성
- 컴파일러/인터프리터에 의한 컴파일 타임
- 소스 코드 분석
- 문법 오류 확인
- 중간 형태로 변환
- 컴파일 결과물(오브젝트 파일 또는 실행 파일) 생성
- 운영 체제에서 실행 파일 실행
- 런타임
- 변수의 값 할당 및 변경
- 동적 메모리 할당
- 함수 호출 및 실행
- 입출력 작업 수행
- 프로그램의 작업 및 상태 변경
- 프로그램 종료
배열의 크기 할당은
2번인 컴파일 과정에 이루어지고,
변수의 값 할당은
5번인 런타임 과정에 이루어지기 때문에!
순서가 맞지 않아서 생기는 오류였던것!
이에 대한 간단한 해결법으로는 변수를 쓰지 않는 것. 즉
c[] 처럼 자동지정 해주거나,
변수가 아닌 상수를 할당하는 방법도 있지만 (const)
문자열 선언시에 변수를 할당하려 하거나
배열의 크기를 미리 알 수 없는 경우에나 맞닥뜨릴만한 오류이기 때문에
그냥 동적할당을 이용하도록 하자