2014-06-06 3 views
-4

다음 코드의 출력을 볼 때 "hello123 hello123 hello123"이 표시됩니다.문자를 사용하여 문자 배열을 인쇄

#include <stdio.h> 

int main() 
{ 
     char arr[4][2][3] = {'h','e','l','l','0','1','2','3'}; 
     printf("%s ", arr); 
     printf("%s ", *arr); 
     printf("%s ", **arr); 
     return 0; 
} 

누구든지 답을 도울 수 있습니까?

+4

무엇이 문제입니까? – Hogan

답변

4

게시 한 코드의 동작은 이며 정의되지 않은 코드는입니다.

'주요'기능에서 : 당신의 컴파일러는 경고를 제공해야합니다 데이터 유형을 인쇄 잘못 지정을 사용하여

5 9 [Warning] missing braces around initializer [-Wmissing-braces] 
    5 9 [Warning] (near initialization for 'arr[0]') [-Wmissing-braces] 
    6 9 [Warning] format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[2][3]' [-Wformat] 
    7 9 [Warning] format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[3]' [-Wformat] 

은 정의되지 않은 동작을 호출합니다.


출력에 대해 가능한 이유는 동일 개시 어드레스를 가리키는 arr, *arr**arr 모두 너무 printf 지정자 %s와 (그러나 모든 타입이 다른지) 그 어드레스 및 정지로부터 읽고 자 시작이다 \0에 저장하고 모든 경우에 동일한 출력을 인쇄합니다.
이니셜 라이저가 사용되었으므로 나머지 배열 요소는 기본적으로 \0으로 초기화됩니다.

+1

추가 정보 : 이니셜 라이저가 괄호로 묶이지 않은 경우 행 우선 순서대로 셀에 적용됩니다. 따라서 인덱스 000 = h, 001 = e, 002 = l, 010 = l, 011 = 0, 012 = 1, 100 = 2, 101 = 3, 다른 모든 것은 널입니다. 'printf' 호출은'arr [0] [0]'의 끝을 읽습니다. 마지막 경우에서도 UB가 발생합니다. 그러나 배열이 연속적이어서 컴파일러가 범위 검사를하지 않기 때문에 다음 행을 읽습니다. –