2013-07-18 6 views
-2

null 종료 C 문자열이 일반적으로 컴파일러에서 자동으로 추가된다고 말하는 것이 옳은가요? 다음 예제 그래서C 문자열의 널 종료

:

char * str = "0124"; 
printf("%x", str[str[3] - str[2] + str[4]]); 

출력은 항상 32?

감사합니다.

+3

출력이 EBCDIC 시스템에서 32가되지 않을 수도 있습니다. –

+1

-1 왜 이상한'printf' 출력에 관심이 있습니까? 이건 그냥 네 질문에서 산만 해, 안 그래? 다시 작성하십시오. –

+1

그것은 "문자열 상수에서 'char *'로의"deprecated 변환 "이라는 경고를 내게합니다. char const * str = "0124" – poorvankBhatia

답변

1

예, 컴파일러는 널 (NULL) 종료를 추가 않습니다이었다. 따라서 스택에서 str에 할당 된 5 바이트의 메모리가 있습니다.

문자열 리터럴을 사용하여 (str [3] - str [2] + str [4])는 (52 - 50 + 0)으로 평가되므로 str [2] 16 진수로 0x32를 출력합니다.

3

첫 번째 질문 : 예

두 번째 질문 : 정수에 당신이 계산 '4' - '2' + '\0' : 예 아스키 시스템에 0x34 - 0x32 + 0 = 2 그래서 당신은 설정 0x32이 '2'입니다 str[2] 얻을. '4' - '2' 2가 C에 정의되어있을 수 있습니다,하지만 당신은 EBCDIC 시스템에서 코드를 실행 한 경우, '2'은은 0xF2

+1

FWIW : ASCII, EBCDIC 또는 다른 문자를 C 자로 설정 한 경우에도 '4'- '2'+ '\ 0' '는 2가됩니다. 연속해야합니다. – chux

1

종료 null 문자는 컴파일러에 의해 추가됩니다. 6.4.5p6 :

6 - 번역 단계 (7)은, 바이트의 값 또는 영의 코드 문자열에서 문자 또는 리터럴 결과 각 멀티 문자 시퀀스에 추가된다. 그런 다음 멀티 바이트 문자 시퀀스를 사용하여 정적 저장 기간 및 길이의 배열을 초기화하는 데 사용하여 시퀀스를 포함하는 데 충분한 만 충분합니다. [...]

printf 출력은 시스템의 2 문자의 문자 코드입니다. 0 ~ 9 문자는 연속 코드 (5.2.1p3)를 갖지만 어떤 특별한 값도 가질 수 없습니다.