programing

constint main = 195는 작동 프로그램을 생성하지만 constint가 없으면 segmentation fault로 끝나는 이유는 무엇입니까?

yellowcard 2023. 11. 1. 22:16
반응형

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세그먼트는 다음과 유사합니다.datasegment(세그먼트)이지만 모든 0으로 초기화됩니다.정적 저장 기간 변수가 한정되지 않았습니다.const이니셜라이저 없이 선언된 것들.
  • stack세그먼트가 이진에 없으며 자동 저장 기간을 가진 변수를 포함합니다.

제거하기const변수의 한정자main이동을 유발합니다.text에게datasegment(세그먼트), 실행할 수 없는 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

반응형