2013-03-28 3 views
0

난 그냥 char 배열에 IP를 할당하기 위해 그것을 인쇄가 옳았다 다음과 같은 결과를 얻었다 확인 :왜이 두 char 배열이 다른 결과를 반환합니까?

int 
main(void) 
{ 
    char ip [11] = "65.55.57.27"; 
    printf(ip); 
    return 0; 
} 

내가

65.55.57.270 " 

얻을하지만을 나는에 배열의 크기를 증가하는 경우 12

int 
main(void) 
{ 
    char ip [12] = "65.55.57.27"; 
    printf(ip); 
    return 0; 
} 

나는

65.55.57.27 
를 얻을 수

누구든지 설명 할 수 있습니까? 크기 12의 배열이 11 개의 char 결과를 반환하는 동안 크기 11의 배열이 13 개의 char 결과를 반환하는 이유는 무엇입니까?

+4

당신이 실제로 관심이 언어를 결정하십시오이 * C 번호 *이 아니다.. –

답변

5

char ip [11] = "65.55.57.27"; 

의 배열 리터럴 문자열이 정확히 11 자이기 때문에 NUL terminator위한 공간이 없습니다.

printf(ip); 

undefined behaviour 갖는 초래한다.

문제를 해결하는 것 다음의

다음 중 하나를

char ip [12] = "65.55.57.27"; 
char ip [] = "65.55.57.27"; 
+0

그냥이 답변에 추가하십시오. 좋은 C IDE에서 실행하십시오.이 11 길이는 설명적인 오류를줍니다.'문자 배열에 대한 이니셜 라이저 문자열이 너무 깁니다. ' –

+0

@HankyPanky ㇱ : 사실이 특별한 경우에는 경고를 기대하지 않습니다. 물론'ip'가'char ip [10]'으로 선언 되었다면 그것은 물고기의 주전자가 될 것입니다). – NPE

+0

@NPE 왜 안 되니? ** 문자열은 ** 12 자 길이입니다. – Aneri

1

당신은 11 바이트의 공간을 만들어뿐만 아니라 당신의 문자 배열에 암시 널 (null)에게 바이트 \0이 존재한다 :

따라서
>> ip 

    {'6', '5', '.', '5', '5', '.', '5', '7', '.', '2', '7', '\0'} 

배열을 그것에 12 개의 요소가 있고, 크기가 너무 많은 요소가 1 개 있습니다. 컴파일러에서 오류가 발생 했어야합니다. 이것은 내가 가진 것입니다 :

error: initializer-string for char array is too long

나는이 사소한 문제를 해결하고 싶지 않아요; 내가 std::string를 사용하는 이유는 다음과 같습니다

#include <string> 
#include <iostream> 

int main() 
{ 
    std::string str = "65.55.57.27"; 

    std::cout << str; 
} 

Live Demo

관련 문제