2017-10-04 8 views
-4

내가 쓴 : 나는 그것을 컴파일 할 때char에 문자열을 할당하면 어떻게됩니까?

char ch = "ABC"; 

지금, 내가 어떤 오류를받지 못했습니다. 그러나 이러한 문자를 개별적으로 또는 전체 문자열을 한 번에 표시하려고하면 그렇게 할 때마다 프로그램이 중단되기 때문에 그렇게 할 수 없습니다.

이 프로그램에서 어떤 현상이 발생합니까?

+1

어떤 컴파일러를 사용합니까? 당신의 플랫폼은 무엇입니까? –

+0

모든 컴파일러에서 적어도 경고가 있어야합니다. 어떤 깃발을 사용하고 있습니까? 프로그램 충돌로 어떤 결과물을 얻었습니까? –

+2

코드가 잘못되었다는 것을 알고 있다면 컴파일러가 무엇을하고 있는지 염려하지 마십시오. 코드를 수정하십시오! 그리고 경고를 켜십시오. –

답변

3

일반적으로 (적어도 합리적으로 현대적인 컴파일러에서) 발생하는 변환은 명백한 캐스트없이 발생해서는 안되기 때문에 오류 메시지가 표시됩니다.

하지만 컴파일러가 더러운 행위를하도록 강요하면 어떻게되는지 생각해 봅시다. 변환을 강제로 수행하는 캐스트가 포함 된 프로그램을 생각해 봅시다. 은 정말 더 명확한 작업을 수행하는 몇 가지 다른 작업을 수행합니다 (필자는 생각합니다).

#include <stdio.h> 

int main() { 
    char const *s = "ABC"; 

    int i = (int)s; 
    unsigned char c = (unsigned char)s; 

    printf("%p\n%8x\n%8x\n", s, i, c); 
} 

은 (단순히 부호 확장 비트 7 포인터의 설정 할 일이 생기면되는 값을 방지하기 위해 unsigned char 대신 char을 사용했습니다).

나는이에서 얻을 출력은 다음과 같습니다

0x4005f4 
    4005f4 
     f4 

그래서 여기 일이 (다른 가능성들) "ABC" 우리가 초기화하는 데 사용할 수있는 문자열 리터럴입니다에 대한 포인터입니다 무엇을 (CONST) 숯. 이 포인터를 void 포인터로 변환하면 문자열 리터럴이 저장되는 주소를 볼 수 있습니다 (참고 : 컴파일하면 얻을 수있는 주소가 다를 수 있습니다).

해당 주소를 부호없는 정수로 변환하면 동일한 값을 얻습니다. 이것은 표준에 의해 보장되는 것은 아니지만 가장 일반적인 경우에 볼 수있는 것입니다.

마지막으로 포인터를 char으로 변환합니다. 16 진수로 출력하면 주소의 최하위 8 비트를 그대로 유지한다는 것을 쉽게 알 수 있습니다. 다시 말하지만 정확히 8 비트라는 사실은 표준에 의해 보장되지는 않지만 char의 일반적인 크기입니다.

면책 조항 : 본인이 제시 한 것과 유사한 결과를 기대할 수 있지만 거의 보장되지 않습니다. void에 대한 포인터 출력이 지원되지만, 사용되는 정확한 형식은 컴파일러/라이브러리에 달려 있습니다. 마찬가지로, 정수형으로 변환 한 결과는 전적으로 보증되지는 않지만 대부분의 일반적인 컴퓨터/컴파일러 구현에서 위에서 보여준 것과 비슷한 결과를 기대할 수 있습니다.

결론 : char에 할당 된 값은 일반적으로 문자열 리터럴 저장에 할당 된 주소의 최하위 8 비트가 될 것입니다 (본질적으로 쓸모가 없습니다).

+0

@ 4386427 : 공정한 포인트. 수정 됨. –