내가 C에서 이런 짓을 한 횟수의, 오래 전, 카운트를 분실했습니다C에서 메모리를 재 해석하는 올바른 방법은 무엇입니까?
struct foo f;
struct foo* pf = &f;
char* pc = (char*) pf;
transmit(pc, sizeof(f));
아니면 :
char* buffer[1024];
receive(buffer, 1024);
float values[256];
for(int ii = 0; ii < 256; ii++) {
float* pf = (float*)(buffer + ii*4);
values[ii] = *pf;
}
아니면 :
uint32_t ipAddress = ...;
uint8_t* p = (uint8_t*)&ipAddress;
uint8_t octets[4] = {p[0], p[1], p[2], p[3]};
printf("%d.%d.%d.%d\n", octets[0], octets[1], octets[2], octets[3]);
다른 포인터 유형으로 캐스팅하여 이런 식으로 메모리를 재 해석하면 정의되지 않은 동작이 호출된다는 것을 발견했습니다. 그리고 위의 모든 예는 절대적으로 필요한 것입니다. 그것들을하는 올바른 방법은 무엇입니까?
당신은'union' 키워드에 관심을 갖게 될까요? – Christoph
개인적으로, 노동 조합을 사용하는 것은 typecast보다 이러한 문제에 대한 훨씬 나쁜 해결책이라고 생각합니다. 더 많은 코드를 작성하고, 더 이상한 유형을 만들고, 여전히 * 모든 곳에서 캐스팅해야합니다. –
@CarlNorum : 타겟 타입이'char'가 아닌 경우 포인터를 캐스팅하면 UB가됩니다. 효과적인 타이핑 규칙은 기본적으로 C를 유형 정보가 메모리 위치 자체에 바인딩되는 강력한 유형 언어로 만듭니다. 그러나 형식 시스템은 컴파일러가 잘못 입력 된 표현식을 통해 메모리에 액세스하려고 시도 할 때 매우 불건전하지만 실제로 이러한 불변량이 더 높은 최적화 수준을 유지한다고 가정 할 수 있습니다 (예 : 'strict-aliasing'의 경우) – Christoph