2014-08-04 12 views
0

같은 문자열의 경우 출력이 각각 1과 2이므로 다음 코드 조각과 관련하여 혼란을 겪고 있습니다.출력 사이의 차이

#include<iostream.h> 
#include<conio.h> 
#include<stdio.h> 
#include<string.h> 
void main() 
{ 
    char str2[1]="a",str3[]="a"; 
    printf("%d %d ",sizeof(str2),sizeof(str3)); 
    getch(); 
} 
+1

대신에 무엇을 기대 했습니까? – mafso

답변

6
char str2[1]="a" 

당신에게 내용 {'a'}와 1 요소 배열을 제공합니다. 이 배열에는 C 문자열의 끝을 나타내는 데 사용되는 nul 터미네이터가 없으므로 str2을 문자열로 사용할 수 없습니다.

str3[]="a" 

당신에게 NUL 종결 공간을 포함하는 문자 배열 범 - 첫 번째 경우 ( str2)는 1로 배열의 크기를 설정 지능 {'a', '\0'}

2

단계; 이니셜 라이저가 두 문자를 제공하더라도 두 번째 char은 지정한 배열의 크기와 일치하도록 잘립니다.

두 번째 경우에는 컴파일러에서 정확한 리터럴 크기를 선택하게합니다.이 경우 정확한 리터럴 크기와 같습니다.

null 종결 자에 여분의 char이 필요하므로 "a"의 크기는 2입니다.

참고 : in order to print size_t in a portable way이 같은 z으로 d, u, 또는 x을 접두사해야합니다 C에서

printf("%zd %zd ",sizeof(str2),sizeof(str3)); 
+0

접두사 z의 사용법을 자세히 설명해 주시겠습니까? –

+0

@JaiHo'sizeof' 표현식은'size_t' 유형입니다. 포맷 지정자'% d'는'int'를 기대하고'size_t'는'int'가 아닙니다. 대답의 마지막 줄에 게시 한 코드 에서처럼 'z'없이 인쇄가 잘되는 경우도 있지만 잘못된 인쇄물이나 충돌로 끝날 수있는 플랫폼이 있습니다. – dasblinkenlight

+0

감사합니다. @dasblinkenlight –

0

문자열 리터럴은 명시 적으로 문자열 리터럴에 지정된 많은 문자가 포함 된 문자 배열의 유형이 그리고 종결 제로.

예를 들어 문자열 리터럴 "a"'a''\0'의 두 문자로 구성되며 char [2] 유형입니다. 배열의 정의에서

str2

char str2[1]="a"; 

당신은 명시 적으로 크기와 동일 1. 그래서 sizeof(str2)number_of_characters * sizeof(char)

str2의 이러한 정의는 것을 고려하다 1과 동일 될 것이라고 지정 C++에서 유효하지 않은 정의로 간주되는 이유는 위의 문자열 리터럴에 종결 자 0이 포함되어 있으므로 초기화 된 객체 (즉 char 유형의 요소)보다 초기화 도구가 많기 때문입니다. 그 사용 방법을 많이 초기화에 기초하여 계산되도록 배열이 정의

char str3[]="a"; 

배열의 크기

지정되지 않는다. 문자열 리터럴에는 두 문자 ( 'a''\0 ')가 포함되어 있으므로 str3은이 문자로 초기화되며 두 요소가 포함됩니다. 즉 str3은 문자열 리터럴의 정확한 사본이됩니다. 따라서 sizeof(str3)은 2와 같습니다.