2013-03-28 182 views
0

我只是分配一個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 

任何人都可以解釋這一點嗎?爲什麼大小爲11的數組返回13個字符的結果,而大小爲12的數組返回11個字符的結果?

+4

請確定你的語言真正感興趣的這是*不* C#。 –

回答

5

char ip [11] = "65.55.57.27"; 

陣列具有用於NUL terminator沒有空間,因爲字符串文字是長恰好11個字符。

這導致

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個字節制造空間,但也存在隱含的空字節\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

相關問題