Notice
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 마이크
- 스피커
- mqtt
- 티스토리챌린지
- 통신 프로토콜
- 명령어
- IOT
- 공유기 포트포워딩
- 부팅 스크립트
- GitHub
- 네트워크
- 오블완
- bfg repo-cleaner
- linux
- 리눅스
- Type of Attacks
- Principles of Security
- 라즈비안 os
- Git
- vm
- mosquitto
- 보안
- ubuntu
- 커밋 이력
- virtualbox
- 라즈베리파이5
- 가상머신
Archives
신짱구의 개발일지
[C++] 스택 크기 오류 본문
스택을 사용한 알고리즘 문제에서 다음과 같이 코드를 작성하고 스택의 크기를 출력했지만, 4294967295 라는 터무니 없는 값이 출력되었다.
else if (str == "pop") {
if (st.empty()) cout << -1 << endl;
else cout << st.top() << endl; st.pop();
}
문제의 원인
문제의 원인은 else 블록에서 두 구문을 한 줄에 작성하여 의도대로 실행되지 않은 것이다. 조건문을 대괄호 없이 사용할 때는 하나의 구문만 허용되고, 그 이상 부터는 조건문과 관계없이 무조건 실행되버린다. 위 코드에서 스택이 empty() 함수에 걸려도 pop() 함수가 if-else 레벨에서 다음으로 실행되었던 것이다. 그래서 허무하게도 pop() 함수 호출하는 구문을 개행해주니까 문제가 해결되었다.
위와 같은 사소한 실수로 인해, 한 가지 알게된 것이 있다.
스택 언더플로우
std::stack에서 size() 함수는 항상 unsigned 타입의 값을 반환하기 때문에 음수로의 표현은 불가능하다. 그렇기 때문에 스택이 비어 있을 때 pop() 함수와 같은 스택의 크기를 줄이는 로직은 스택의 크기를 -1로 변경하려 한다. 그러나, 스택의 크기는 음수가 될 수 없기 때문에 unsigned int 타입으로 변환되면서 최대값인 4294967295로 표시된다.
그러하여, 위와 같은 상황에서도 이미 스택의 크기가 0 이었음에도 pop() 함수를 실행했기 때문에 4294967295 값이 출력되었던 것이다.
혹시나 나와 같은 문제가 발생한 사람들에게 도움이 되길 바란다!