이 답변 에서 저자는 C에서 포인터를 캐스팅하는 방법에 대해 논의했습니다. 나는 이것을 시도하고 다음 코드를 구성했습니다.
#include <stdio.h>
int main(void) {
char *c;
*c = 10;
int i = *(int*)(c);
printf("%d", i);
return 1;
}
이것은 (경고와 함께) 컴파일되고 바이너리를 실행하면 bus error: 10
. 나는 char가 int보다 작은 크기라는 것을 이해합니다. 나는 또한이 게시물 에서이 오류를 예상해야 함을 이해 합니다. 그러나 누군가 여기서 무슨 일이 일어나고 있는지 명확히 할 수 있다면 정말 감사하겠습니다. 또한 포인터를 캐스팅하고 int 포인터를 역 참조하여 10을 얻는 올바른 방법이 있는지 알고 싶습니다 (이 예제에서는). 감사!
편집 : 내 의도를 명확히하기 위해, 걱정된다면 포인터 캐스팅의 "작동하는"예제를 생각해 보려고합니다. 이것은 단지이 허용되는 쇼이다 힘의 C.에서 작업
c
역 참조하면 초기화되지 않습니다. 그것은 정의되지 않은 행동입니다.
마찬가지로, 경우에도 c
한 초기화, 당신에게 그것의 배역 int *
다음 역 참조는 정의되지 않은 동작입니다 메모리에서 추가 바이트, 어떤 수를 얻을 것입니다.
시도중인 작업을 보여주는 작동하는 (안전한) 예 :
int main(void)
{
int i = 10;
int *p = &i;
char c = *(char *)p;
printf("%d\n", c);
return 0;
}
이 프로그램은 10
little-endian 기계와 0
big-endian 기계에서 인쇄합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다