@ptrFromInt

@ptrFromInt

정수를 포인터로 바꿔야 할 때가 있어요. 예를 들어 어떤 메모리 주소 값을 손에 쥐고 있는데, 그 주소를 가리키는 포인터 타입이 필요할 때죠. 이때 쓰는 게 바로 @ptrFromInt 예요.

출처: Zig Documentation

본문

@ptrFromInt(address: usize) anytype

@ptrFromInt는 정수를 포인터로 변환해요. 반환 타입은 추론된 결과 타입(inferred result type)이에요. 즉, 이 값을 받는 쪽의 타입에 맞춰서 포인터 타입이 결정된다고 이해하면 돼요.

반대로 포인터를 정수로 되돌리고 싶다면 @intFromPtr을 쓰면 돼요. 그리고 여기서 반드시 짚고 넘어갈 게 하나 있어요 — 주소 0을 어떻게 다루느냐 하는 문제예요.

주소 0을, optional이 아니면서 allowzero 속성이 없는 포인터 타입으로 캐스팅하면, 런타임 안전 검사(runtime safety checks)가 켜져 있을 때 Pointer Cast Invalid Null 패닉이 발생해요. 주소 0은 널 포인터를 의미하기 때문에, 그 값을 실제 포인터로 받아들이는 걸 안전하게 차단해 주는 거예요.

만약 대상 포인터 타입이 주소 0을 허용하지 않는데(즉 optional도 아니고 allowzero도 없는데) address가 0이라면, 이건 안전 검사를 거치는 Illegal Behavior(불법 동작)를 호출해요. 정리하면 — 주소 0을 그냥 포인터로 우겨 넣으려는 시도 자체를 Zig가 안전하게 막아 준다고 보면 돼요.

더 알아보기 (Learn more)

  • @intFromPtr — 포인터에서 정수로 가는 반대 방향 변환