> 백엔드 개발 > C++ > 배열을 가리키지 않는 경우 'char *' 포인터에 정의되지 않은 동작을 추가합니까?

배열을 가리키지 않는 경우 'char *' 포인터에 정의되지 않은 동작을 추가합니까?

Linda Hamilton
풀어 주다: 2024-11-10 14:41:02
원래의
496명이 탐색했습니다.

Is Adding to a

"char *" 포인터에 추가: UB 또는 Not?

C 17은 포인터에 적분 표현식을 추가하는 규칙을 정의합니다. 결과가 가리키는 배열의 범위를 초과하면 정의되지 않은 동작이 발생합니다. 그러나 정의는 특히 배열 요소를 가리키는 포인터와 관련이 있습니다.

다음 코드 조각을 고려하세요.

struct Foo {
    float x, y, z;
};

Foo f;
char *p = reinterpret_cast<char *>(&f) + offsetof(Foo, z); // (*)
*reinterpret_cast<float *>(p) = 42.0f;
로그인 후 복사

라인(*)이 정의되지 않은 동작을 트리거하는지 여부에 대한 의문이 생깁니다. float에 대한 주소를 char 포인터로 재해석하더라도 char 배열을 가리키지 않습니다. 따라서 인용된 정의에 따르면 이는 정의되지 않은 동작으로 보입니다. 그러나 만약 그렇다면, offsetof 매크로의 유용성은 심각하게 손상될 것입니다.

그러나 C는 또한 사소하게 복사 가능한 유형의 기본 바이트를 문자 배열로 복사하는 것을 허용합니다. std::memcpy와 같은 함수를 사용하거나 바이트 단위로 수동으로 수행할 수 있는 이 작업에서는 원본 객체가 배열일 필요가 없습니다.

결과적으로 이러한 바이트 단위 작업이 성공할 수 있도록 하려면 포인터에 적분 표현식을 추가하려면 객체의 원시 바이트를 가리키는 포인터에 대해 정의해야 합니다. 이러한 바이트가 암시적으로 배열을 형성하는지 아니면 일반 추가 규칙에 대한 특별한 예외를 구성하는지 여부는 불분명합니다. 그럼에도 불구하고 두 가지 해석 모두 제공된 코드 예제에 추가된 내용의 타당성을 정당화합니다. 따라서 이 컨텍스트에서 "char *" 포인터를 추가해도 정의되지 않은 동작이 발생하지 않습니다.

위 내용은 배열을 가리키지 않는 경우 'char *' 포인터에 정의되지 않은 동작을 추가합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿