2017-01-02 1 views
1

두 줄을 쓰지 않고 "ptr"을 사용하여 zend_long을 직접 할당하는 방법은 무엇입니까?C 포인터 유형 캐스팅

zend_long *val = *ptr; 
*val = *(ISC_LONG*)var->sqldata; 
+1

'ptr'의 유형 ??? –

+0

그것은 "char ** ptr" 실제로 funstion 인수로 제공됩니다. – Marcodor

+1

_compatible types_가 아닌 한 정의되지 않은 동작을 호출합니다. – Olaf

답변

3

원래 코드가 올바른지 가정은 해당 과제는 다음과 같습니다 : 두 개의 구조체가 호환 될 일이없는 한

포인터가이 같은 캐스트
*((zend_long*)*ptr) = *(ISC_LONG*)var->sqldata; 
+1

그것은 많은 감사합니다! – Marcodor

+0

엄격한 별칭 위반으로 인해 정의되지 않은 동작이 발생할 가능성이 큽니다. 'zend_long'이'ISC_LONG'과 타입 호환이되지 않는다면 말입니다. – Lundin

+0

@ Lundin 맞습니다. 그래서 위의 코드는 원래 코드가 맞을 때만 작동한다고 썼습니다. – dasblinkenlight

0

가, C에서 잘 정의 된 행동을하지 않습니다 유형. 즉, 동일한 순서로 동일한 구성원을 가져야합니다.

그럴 필요가 없다면 C에서이 작업을 수행하는 쉬운 방법이 없습니다. 어떻게 든 작동하도록 만들면 운이 좋지 않을 수 있습니다. 코드가 언제든지 충돌 할 수 있습니다. 정의되지 않은 동작 때문입니다.

이러한 캐스트는 소위 strict aliasing rule을 위반하기 때문입니다. 예를 들어 구조체를 공용체 유형으로 묶는 방법으로 해당 규칙을 피할 수 있습니다.

+0

유용한 정보 주셔서 감사합니다. 나는 오버 캐스팅도 좋아하지 않는다. 그러나이 경우에는 "시행"됩니다. 여기에 정의 된 ISC_LONG : https://github.com/FirebirdSQL/firebird/blob/c6d9135586fde54b52e5c26f74d5dfd20c188f3f/src/include/types_pub.h#L111 및 zend_long은 PHP 소스에서 거의 동일한 정의를 갖습니다. 따라서 값으로 할당하는 것이 안전해야합니다. – Marcodor

+0

@Marcodor 정수형이 같은 크기라면 괜찮습니다. 크기가 다르거 나 구조체 인 경우 문제가 발생할 수 있습니다. – Lundin