> 백엔드 개발 > C++ > C에서 Char 변수의 주소가 올바르게 표시되지 않는 이유는 무엇입니까?

C에서 Char 변수의 주소가 올바르게 표시되지 않는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2025-01-03 19:02:43
원래의
836명이 탐색했습니다.

Why Doesn't the Address of a Char Variable Display Correctly in C  ?

Char 데이터의 주소가 표시되지 않는 이유는 무엇입니까?

다음 코드를 고려하세요.

class Address {
public:
    int i;
    char b;
    string c;
    
    void showMap();
};

void Address::showMap() {
    cout << "address of int    : " << &i << endl;
    cout << "address of char   : " << &b << endl;
    cout << "address of string : " << &c << endl;
}
로그인 후 복사

이 코드를 실행할 때 , char 변수 'b'의 주소가 출력에 표시되지 않음을 알 수 있습니다. 대신 빈 영역이 표시됩니다. 왜 이런 일이 발생하나요?

그 이유는 주소 연산자(&)가 다양한 데이터 유형에서 작동하는 방식에 있습니다. char 변수 &b에 적용하면 char 포인터, 즉 char *를 얻습니다.

기본적으로 출력 연산자 << 이 char*를 C 스타일 문자열로 해석하고 문자 시퀀스를 인쇄하려고 시도합니다. 하지만 이 경우 char 변수의 값이 아닌 주소만 표시하려고 합니다.

이 문제를 해결하려면 다음 접근 방식을 사용할 수 있습니다.

cout << "address of char   : " << (void *) &b << endl;
로그인 후 복사

여기 , 출력 연산자와 함께 사용하기 전에 b의 주소를 void *로 캐스팅합니다. 이렇게 하면 연산자가 이를 문자 시퀀스가 ​​아닌 메모리 위치에 대한 포인터로 처리합니다.

주소 8의 차이점은 무엇입니까?

멤버 변수 'int', 'char' 및 'string'이 공개되면 또 다른 흥미로운 동작을 관찰할 수 있습니다. 'int'와 'string' 주소의 차이는 일관되게 8입니다. 그 이유는 다음과 같습니다.

  • 대부분의 아키텍처에서 int의 기본 정렬은 4바이트입니다.
  • 기본값 문자 정렬은 1바이트입니다.
  • 문자열의 기본 정렬은 4입니다. bytes.

컴파일러는 클래스 멤버에 메모리를 할당할 때 각 경계에 정렬하는 방식으로 할당합니다. 이 경우 char 변수 'b'는 1바이트를 차지하므로 3바이트의 사용되지 않은 공간이 남습니다. 이 공백 뒤에는 가장 가까운 4바이트 경계에 정렬되는 문자열 변수 'c'가 옵니다.

결과적으로 '&c'와 '&b' 주소 간의 차이는 1( 'b'의 경우) 3(사용되지 않은 공간의 경우) 4('c'의 4바이트 정렬의 경우) = 8.

위 내용은 C에서 Char 변수의 주소가 올바르게 표시되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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