programing

이 코드 segfault는 64비트 아키텍처에서는 정상적으로 동작하지만 32비트에서는 정상적으로 동작하는 이유는 무엇입니까?

kingscode 2022. 7. 10. 19:10
반응형

이 코드 segfault는 64비트 아키텍처에서는 정상적으로 동작하지만 32비트에서는 정상적으로 동작하는 이유는 무엇입니까?

우연히 다음과 같은 C 퍼즐을 발견했습니다.

Q: IA-64에서는 다음 프로그램 segfault가 발생하는데 IA-32에서는 정상적으로 작동하는 이유는 무엇입니까?

  int main()
  {
      int* p;
      p = (int*)malloc(sizeof(int));
      *p = 10;
      return 0;
  }

의 사이즈가int64비트 머신의 경우 포인터의 크기와 다를 수 있습니다(int는 32비트, 포인터는 64비트입니다).그러나 나는 이것이 위의 프로그램과 어떻게 관련되어 있는지 잘 모르겠다.좋은 생각 있어요?

출연자:int*제대로 된 것이 없다면#include반환형malloc라고 상정하고 있다.intIA-64는 우연히sizeof(int) < sizeof(int*)이 문제는 명백합니다.

(또한 정의되지 않은 동작으로 인해 다음과 같은 플랫폼에서도 장애가 발생할 수 있습니다.sizeof(int)==sizeof(int*)는 true를 유지합니다.예를 들어, 호출규칙이 포인터를 반환하기 위해 정수 이외의 레지스터를 사용한 경우)

comp.lang.c FAQ에는 왜 수익 창출이 전혀 필요하지 않고 잠재적으로 나쁜지에 대해 설명하는 항목이 있습니다.

가장 가능성이 높은 것은, 다음의 헤더 파일을 포함하지 않는 경우입니다.malloc컴파일러는 보통 이 점에 대해 경고하지만, 반환값을 명시적으로 제시한다는 것은 자신이 무엇을 하고 있는지 알고 있다는 것을 의미합니다.

즉, 컴파일러는 다음 명령을 실행할 수중에 넣을 수 있는int돌아오다malloc그런 다음 포인터에 캐스트합니다.사이즈가 다르면 슬퍼할 거예요.

이래서 캐스팅을 안 하는구나mallocC로 반환한다.void*반환되는 것은 올바른 유형의 포인터로 암묵적으로 변환됩니다(이 경우 안전하지 않을 수 있는 int-to-time 변환에 대해 경고할 수 있는 헤더를 포함하지 않는 한).

그렇기 때문에 시제품 누락에 대한 경고 없이 컴파일할 수 없습니다.

이래서 C에서 malloc return을 캐스팅하지 않는 거야.

C++ 호환성을 위해 캐스팅이 필요합니다.그것을 생략할 이유는 거의 없다.

C++ 호환성이 반드시 필요한 것은 아니며, 일부의 경우 전혀 가능하지 않지만 대부분의 경우 매우 쉽게 호환됩니다.

언급URL : https://stackoverflow.com/questions/7545365/why-does-this-code-segfault-on-64-bit-architecture-but-work-fine-on-32-bit

반응형