이 코드 segfault는 64비트 아키텍처에서는 정상적으로 동작하지만 32비트에서는 정상적으로 동작하는 이유는 무엇입니까?
우연히 다음과 같은 C 퍼즐을 발견했습니다.
Q: IA-64에서는 다음 프로그램 segfault가 발생하는데 IA-32에서는 정상적으로 작동하는 이유는 무엇입니까?
int main()
{
int* p;
p = (int*)malloc(sizeof(int));
*p = 10;
return 0;
}
의 사이즈가int
64비트 머신의 경우 포인터의 크기와 다를 수 있습니다(int
는 32비트, 포인터는 64비트입니다).그러나 나는 이것이 위의 프로그램과 어떻게 관련되어 있는지 잘 모르겠다.좋은 생각 있어요?
출연자:int*
제대로 된 것이 없다면#include
반환형malloc
라고 상정하고 있다.int
IA-64는 우연히sizeof(int) < sizeof(int*)
이 문제는 명백합니다.
(또한 정의되지 않은 동작으로 인해 다음과 같은 플랫폼에서도 장애가 발생할 수 있습니다.sizeof(int)==sizeof(int*)
는 true를 유지합니다.예를 들어, 호출규칙이 포인터를 반환하기 위해 정수 이외의 레지스터를 사용한 경우)
comp.lang.c FAQ에는 왜 수익 창출이 전혀 필요하지 않고 잠재적으로 나쁜지에 대해 설명하는 항목이 있습니다.
가장 가능성이 높은 것은, 다음의 헤더 파일을 포함하지 않는 경우입니다.malloc
컴파일러는 보통 이 점에 대해 경고하지만, 반환값을 명시적으로 제시한다는 것은 자신이 무엇을 하고 있는지 알고 있다는 것을 의미합니다.
즉, 컴파일러는 다음 명령을 실행할 수중에 넣을 수 있는int
돌아오다malloc
그런 다음 포인터에 캐스트합니다.사이즈가 다르면 슬퍼할 거예요.
이래서 캐스팅을 안 하는구나malloc
C로 반환한다.그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
'programing' 카테고리의 다른 글
여기서 ptr은 NULL이 파손된 메모리인 free(ptr)가 됩니까? (0) | 2022.07.10 |
---|---|
크로스 브라우저 플랫폼 테스트 (0) | 2022.07.10 |
npm은 의 피어를 필요로 합니다. (0) | 2022.07.10 |
리플렉션을 사용하여 패키지의 모든 클래스를 찾을 수 있습니까? (0) | 2022.07.10 |
Vuex mapstate 개체가 정의되지 않았으며 [vuex] 알 수 없는 변환 유형: " (0) | 2022.07.10 |