2016-12-29 4 views
4

주소로 처리되는 정수 리터럴을 역 참조하려면 이식성/유효합니까?C에서 정수식 포인터 리터럴을 역 참조 할 때 유효합니다.

*(uint64_t *)(0x12345678) = 123ULL; 

난 (gcc -std=c89 -Wall input.c 통해 테스트)에는 컴파일러 경고가 표시되지 : I가 123에 메모리 어드레스 0x12345678에 64 비트 값을 설정할 경우, 즉, 적어도 C89 표준에 의해 다음과 같은 휴대용 및 유효한 C이다 ,하지만이 주제에 대한 질문은 정수형 리터럴 (포인터 주소로 변환 됨)을 직접적으로 참조 해제하는 대신 중간 변수에 주소를 저장하는 경우가 있습니다.

+0

휴대용을 무엇이라고합니까? 필자가 이런 식으로 한 유일한 시간은 임베디드 시스템을 프로그래밍 할 때 내가 그 주소에서 무엇을 찾을 수 있는지입니다. 그 외에는 이식성이 없습니다. – DeiDei

답변

3

0x12345678 주소가 유효하고 uint64_t 개체가있는 한 캐스트 또는 직접 정수를 사용하는 데 문제가 없습니다. 그러나 모든 플랫폼에서 유효한 주소가 아닐 수도 있습니다. 그래서, 당신이 상대하고있는 것을 알고 있다면 괜찮습니다.

고정 폭 유형은 C99에만 도입되었습니다. 그래서, C89에서 uint64_t*에 캐스트의 이식성에 대해 질문 할 때 나는 역설적이라고 느낍니다.

+0

고정 폭 유형에 좋은 점. 정보 주셔서 감사합니다. – DevNull

+0

부록 : 실제로 대부분의 C89 시스템/컴파일러에는 64 비트 정수를 가져올 수있는 이식성있는 방법이 없습니다 ('long long'은 당시 존재하지 않았고 'long'은 종종 32 비트이기 때문에). 어떤 컴파일러는'__int64'를 통해 이것을 확장하지만, 같은 컴파일러는 일반적으로 C89를 ''으로 확장하므로 어쨌든 사용합니다. 또는 더 이식성있게 :'MYuint64' 또는 유사 (long long,'','unsigned __int64' 또는 사용 가능한 다른 것을 사용)를 정의하는 커스텀'types.h'. –

관련 문제