티스토리 뷰
배열의 길이를 3으로 정의하면 char이 3개 이하로 들어가야지 정상적으로 문자열이 처리될 것이다.
char str[3];
만약 배열의 범위를 넘어서 사용하면 문법적으로 오류일까?
다음과 같이 str[3], str[4]에도 값을 저장해보자.
for(int i=0;i<5;i++) str[i] = 'a';
컴파일을 해보면 알겠지만 이렇게 해도 문법적으로 오류가 나지 않는다. 컴파일도 되고, 실행파일도 생길 것이다.
cout << str;
출력을 해봐도 'aaaaa' 이렇게 다섯개의 a가 모두 출력될 것이다. 실제로 str[3], str[4]에 접근이 가능하다.
이유는 str[i] 라는 것은 단순히 주소를 표현하는 형식이기 때문에 컴파일러는 그 표현이 유효한지는 검사하지 않는다. 따라서 컴파일 했을 때 특별히 오류가 뜨지는 않는다.
이런 상황은 개발자가 직접 해결해야하는 버그가 발생한 상황이라고 이해하는 것이 좋다.
첫 매모리를 초과하는 시점 ( str[3]에 접근해서 값을 넣는 시점 )에 오류가 발생해야하지만 아마 종료해야할 만큼 치명적인 상황이 아니라서 별다른 문제 없이 프로그램이 진행된 것이다. 그러나 프로그램이 강제 종료 되지 않았다고 해서 문제가 없는 것은 아니다. 엄연히 버그 상황이며 메모리를 초과해서 사용한 것은 틀림없기 때문에 다른 부분에서 오류가 날 수 있다.
아주 간단한 버그 상황을 살펴보자.
char firstArr[3];
char secondArr[3];
// 주소값 출력
for(int i=0;i<3;i++) printf("firstArr[%s]: %x\n", i firstArr[i]);
for(int i=0;i<3;i++) printf("secondArr[%s]: %x\n", i secondArr[i]);
cin >> firstArr;
cin.clear();
cin >> secondArr;
cout << firstArr <<endl;
cout << secondArr <<endl;
secondArr에는 배열의 범위에 초과해서 입력을 해봤더니 두 배열을 출력했을 때 firstArr에 secondArr의 내용이 들어가있음을 확인할 수 있었다. 이는 두 배열의 주소값을 보면 이유를 알 수 있다.
주소값을 보면 secondeArr[2] 다음이 firstArr[0] 으로 이어지는 것을 볼 수 있다. 때문에 secondArr에 초과해서 입력을 하면 에러는 발생하지 않지만 버그 상황이 발생하는 것이다.
'C++' 카테고리의 다른 글
[C++] std::ios_base::sync_with_stdio(false); (0) | 2022.02.16 |
---|---|
[C++] 직접 정의한 헤더파일 사용해보기 (네임스페이스와 클래스) (0) | 2022.02.11 |
[C++] 헤더 파일과 네임스페이스 (0) | 2022.02.09 |
[C++] 배열 초기화하는 방법 (0) | 2022.02.03 |
[C++] 표준 입력함수와 입력버퍼 관리 : cin / cin.getline / getline / cin.get / cin.fail / cin.clear / cin.ignore (0) | 2022.02.03 |
- Total
- Today
- Yesterday
- Winform
- flutterdoctor
- androidstudio
- VS Code
- QO
- multiple Column
- apt-get
- mac unity vscode autocomplete
- 버추얼박스
- 우분투
- gridContorl
- Unity vs code
- 해마코딩
- DataSource
- Flutter
- DevExpress
- Mac
- ()
- select
- apt
- VirtualBox
- Tree
- ubuntu
- 컨셉때문에킹받으셨나요..죄송합니다..제가 봐도 킹받네요
- Unity
- =
- GIT
- Query
- mac Unity vscode 자동완성
- 트리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |