>  기사  >  백엔드 개발  >  C 17에서 문자 배열을 가리키지 않을 때 포인터 추가가 정의되지 않습니까?

C 17에서 문자 배열을 가리키지 않을 때 포인터 추가가 정의되지 않습니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-11 11:48:03473검색

Is Pointer Addition Undefined When Not Pointing to a Character Array in C  17?

Char 배열을 가리키지 않을 때 포인터 추가가 정의되지 않습니까?

C 17 표준에서는 포인터에 정수 값을 추가하면 피연산자와 동일한 유형의 포인터, 그리고 연산이 배열 내에 있는 경우 결과는 배열 내의 (가설) 요소를 가리킵니다. 경계. 그러나 이것이 char 배열을 가리키지 않는 포인터에 적용되는지 여부는 불분명합니다.

다음 코드를 고려하세요.

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

Foo f;
char *p = reinterpret_cast<char *>(&f) + offsetof(Foo, z); // (*)
*reinterpret_cast<float *>(p) = 42.0f;

(*)로 표시된 줄은 정의되지 않은 동작( UB)? 포인터 p는 문자 배열이 아닌 부동 소수점을 가리킵니다. 인용된 단락에 따르면 이로 인해 UB가 발생합니다. 그러나 UB인 경우 offsetof()의 유용성이 크게 제한됩니다.

사소하게 복사 가능한 유형에 대한 표준 정의에 따르면 std::memcpy와 같은 함수를 사용하여 기본 바이트를 char 배열로 복사할 수 있다고 명시되어 있습니다. . 이는 결과가 바이트를 배열로 복사하는 데 사용되는지 여부에 관계없이 객체를 구성하는 원시 바이트에 대한 포인터에 대해 추가가 정의되어야 함을 의미합니다.

이것은 관련 바이트가 이미 배열을 형성한다는 의미인지 여부 또는 운영자의 일반적인 규칙에 대한 특별한 예외가 불명확합니다. 그러나 두 가지 해석 모두 코드의 추가 내용을 유효하게 만듭니다. 따라서 char * 포인터에 추가한다고 해서 char 배열을 가리키지 않더라도 반드시 UB가 되는 것은 아니라는 결론을 내릴 수 있습니다.

위 내용은 C 17에서 문자 배열을 가리키지 않을 때 포인터 추가가 정의되지 않습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.