내가 쓴 : 나는 그것을 컴파일 할 때char에 문자열을 할당하면 어떻게됩니까?
char ch = "ABC";
지금, 내가 어떤 오류를받지 못했습니다. 그러나 이러한 문자를 개별적으로 또는 전체 문자열을 한 번에 표시하려고하면 그렇게 할 때마다 프로그램이 중단되기 때문에 그렇게 할 수 없습니다.
이 프로그램에서 어떤 현상이 발생합니까?
내가 쓴 : 나는 그것을 컴파일 할 때char에 문자열을 할당하면 어떻게됩니까?
char ch = "ABC";
지금, 내가 어떤 오류를받지 못했습니다. 그러나 이러한 문자를 개별적으로 또는 전체 문자열을 한 번에 표시하려고하면 그렇게 할 때마다 프로그램이 중단되기 때문에 그렇게 할 수 없습니다.
이 프로그램에서 어떤 현상이 발생합니까?
일반적으로 (적어도 합리적으로 현대적인 컴파일러에서) 발생하는 변환은 명백한 캐스트없이 발생해서는 안되기 때문에 오류 메시지가 표시됩니다.
하지만 컴파일러가 더러운 행위를하도록 강요하면 어떻게되는지 생각해 봅시다. 변환을 강제로 수행하는 캐스트가 포함 된 프로그램을 생각해 봅시다. 과은 정말 더 명확한 작업을 수행하는 몇 가지 다른 작업을 수행합니다 (필자는 생각합니다).
#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 비트가 될 것입니다 (본질적으로 쓸모가 없습니다).
@ 4386427 : 공정한 포인트. 수정 됨. –
어떤 컴파일러를 사용합니까? 당신의 플랫폼은 무엇입니까? –
모든 컴파일러에서 적어도 경고가 있어야합니다. 어떤 깃발을 사용하고 있습니까? 프로그램 충돌로 어떤 결과물을 얻었습니까? –
코드가 잘못되었다는 것을 알고 있다면 컴파일러가 무엇을하고 있는지 염려하지 마십시오. 코드를 수정하십시오! 그리고 경고를 켜십시오. –