constint main = 195는 작동 프로그램을 생성하지만 constint가 없으면 segmentation fault로 끝나는 이유는 무엇입니까?
C 프로그램을 따르는 것을 고려합니다(여기 라이브 데모 참조).
const int main = 195;
현실 세계에서 이런 코드를 쓰는 프로그래머는 없다는 것을 알고 있습니다. 유용한 목적도 없고 말도 안 되기 때문입니다.하지만 내가 제거할 때는const
프로그램 위에서 키워드를 입력하면 바로 세그멘테이션 오류가 발생합니다. 왜죠?나는 이것의 배후에 있는 이유를 알고 싶습니다.
GCC 4.8.2는 이를 컴파일할 때 다음과 같은 경고를 제공합니다.
경고: 'main'은 일반적으로 [-Wmain] 함수입니다.
const int main = 195; ^
존재와 부재가 왜const
키워드가 프로그램의 행동에 영향을 주나요?
값 195가 어떻게 대응되는지 관찰합니다.ret
(기능에서 복귀) 8086 호환성에 대한 지침.의 이 정의는main
따라서 마치 당신이 그것을 정의한 것처럼 행동합니다.int main() {}
처형시에
일부 플랫폼에서는const
데이터는 실행 가능하지만 쓰기 가능하지 않은 메모리 영역에 로드되는 반면, 변이 가능한 데이터(즉, 데이터가 자격이 없음)const
)가 쓰기 가능하지만 실행 가능하지 않은 메모리 영역에 로드됩니다.이러한 이유로, 프로그램은 당신이 선언할 때 "작동"합니다.main
~하듯이const
하지만 당신이 그 일을 그만둘 때는 안 됩니다.const
한정자
전통적으로 쌍성은 세 개의 세그먼트로 구성되어 있었습니다.
- 그
text
세그먼트는 (아키텍처에서 지원하는 경우) 쓰기 방지되고 실행 가능하며, 실행 코드를 포함하고 있으며, 정적 스토리지 기간 변수가 한정됨const
, 그리고 현악기 리터럴. - 그
data
세그먼트는 쓸 수 있으므로 실행할 수 없습니다.한정되지 않은 변수가 포함되어 있습니다.const
정적 저장 기간 및 할당된 저장 기간을 가진 (실행 시) 개체 - 그
bss
세그먼트는 다음과 유사합니다.data
segment(세그먼트)이지만 모든 0으로 초기화됩니다.정적 저장 기간 변수가 한정되지 않았습니다.const
이니셜라이저 없이 선언된 것들. - 그
stack
세그먼트가 이진에 없으며 자동 저장 기간을 가진 변수를 포함합니다.
제거하기const
변수의 한정자main
이동을 유발합니다.text
에게data
segment(세그먼트), 실행할 수 없는 segment(세그먼트), 관찰하는 segmentation(세그먼트) 위반을 야기합니다
현대적인 플랫폼은 종종 추가적인 세그먼트(segment가 있습니다(예:rodata
쓰기 가능하지도 실행 가능하지도 않은 데이터에 대한 세그먼트(segment)를 제공하므로 플랫폼별 설명서를 참조하지 않고 플랫폼에 대한 정확한 설명으로 간주하지 마십시오.
만들지 않는 것을 이해해 주시기 바랍니다.main
함수는 일반적으로 틀리지만, 기술적으로 플랫폼이 허용할 수 있습니다.main
변수로 선언됩니다. cf.ISO 9899:2011 §5.1.2.2.11, 강조사항:
1 프로그램 시작시 호출되는 함수의 이름은
main
. 구현에서 이 기능에 대한 프로토타입이 없음을 선언합니다.다음과 같은 반환 유형으로 정의되어야 합니다.int
매개변수가 없거나(...), 두 개의 매개변수가 있거나(...), 또는 이와 동등한 방식으로 또는 다른 구현 정의 방식으로 정의할 수 있습니다.
주식회사,main
세계적인 범위에서 거의 항상 함수입니다.
사용방법main
전역 범위의 변수로 인해 프로그램의 동작이 정의되지 않습니다.
(당신이 글을 쓸 때가 그럴 수도 있습니다.const
컴파일러는 변수를 상수로 최적화하므로 프로그램 동작이 다릅니다.그러나 프로그램 동작은 여전히 정의되지 않습니다.
언급URL : https://stackoverflow.com/questions/33305574/why-does-const-int-main-195-result-in-a-working-program-but-without-the-const
'programing' 카테고리의 다른 글
SQL 명령이 제대로 종료되지 않았습니까? (0) | 2023.11.06 |
---|---|
jquery 작업 후 URL 가져오기 (0) | 2023.11.06 |
JDBC - Oracle ArrayIndexOutOfBounds 예외 (0) | 2023.11.01 |
powershell: invoke-sqlcmd에 의한 오류 원인을 잡는 방법? (0) | 2023.11.01 |
CSS를 사용하면 캔버스가 늘어나지만 '너비'와 '높이' 속성은 정상입니다. (0) | 2023.11.01 |