>백엔드 개발 >C++ >클래스에 있는 Char 멤버의 주소 인쇄가 때때로 공백으로 나타나는 이유는 무엇이며, 그렇지 않은데 8바이트 오프셋이 있는 이유는 무엇입니까?

클래스에 있는 Char 멤버의 주소 인쇄가 때때로 공백으로 나타나는 이유는 무엇이며, 그렇지 않은데 8바이트 오프셋이 있는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-20 07:50:10988검색

Why Does Printing the Address of a Char Member in a Class Sometimes Appear Blank, and Why Is There an 8-Byte Offset When It's Not?

Char 데이터 표시 이상 주소

int, char, string 등 다양한 타입의 데이터 멤버로 구성된 클래스를 포함하는 프로그램에서, 이러한 데이터 멤버의 주소를 인쇄할 때 예상치 못한 관찰이 나타납니다. int 및 string의 주소가 표시되는 동안 char 데이터 멤버의 주소는 공백으로 나타납니다.

이 문제를 해결하려면 char 데이터 유형의 기본 표현을 고려하십시오. & 연산자를 사용하여 char 변수의 주소를 얻으면 char에 대한 포인터를 얻습니다. 그러나 스트림 삽입 연산자(<<)는 이 포인터를 C 스타일 null 종료 문자열로 해석합니다. 결과적으로, 이 경우에는 존재하지 않는 포인터와 관련된 문자열을 인쇄하려고 시도합니다.

이 동작을 수정하려면 static_cast를 사용하여 char 변수의 주소를 void 포인터로 명시적으로 캐스팅합니다. 이렇게 하면 스트림 삽입 연산자에 값을 문자열이 아닌 주소로 해석하도록 지시하게 됩니다.

<br>cout << "문자의 주소:" << static_cast<void *>(&b) << endl;<br>

또한 클래스 데이터 멤버가 공개로 선언되면 흥미로운 일이 발생합니다. 이제 char 변수의 주소가 표시되지만 int 변수의 주소와 비교하여 8바이트의 오프셋이 있습니다.

<br> ... int : Something <br> .. . char : Something_2<br> ... string : Something_3<br>

흥미롭게도, Something_2 - Something은 항상 8입니다. 이는 효율적인 메모리 레이아웃을 위해 클래스 멤버에 적용된 패딩에서 비롯됩니다. char 변수는 1바이트만 차지함에도 불구하고 정렬 요구 사항으로 인해 4바이트를 할당합니다. 이 3바이트 패딩은 관찰된 오프셋을 생성합니다.

위 내용은 클래스에 있는 Char 멤버의 주소 인쇄가 때때로 공백으로 나타나는 이유는 무엇이며, 그렇지 않은데 8바이트 오프셋이 있는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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