2017-08-28 81 views
2

我是新來的c,並且被字符串結尾字符'\ 0'弄糊塗了,我應該分配它嗎?我應該在c中手動分配字符串結尾字符' 0'嗎?

例如,我想存儲一個最大長度爲6的字符串;

如果我使用數組,我應該使用char str[6]還是char str[7]

char as[3] = "abc"; 
    printf("%s\n", as); 
    //seems no problem 

如果我使用字符指針,我應該使用char *str = malloc(6)char *str = malloc(7)

+0

是的,請。加上1. – pablo1977

+1

你想存儲一個最大長度爲6的字符串。你應該使用'char str [7]'。如果你使用char指針,你應該使用'char * str = malloc(7);'也'printf(「%s \ n」,as); //這problem' – BLUEPIXY

+1

記住,只是因爲事情似乎工作,這並不意味着它是正確的。在你的例子中,'char as [3] =「abc」',可能會或可能不會是內存中'as'後面的零字節。 'printf'簡單*假設*它有一個指向有效字符串的指針。行爲是未定義的。 –

回答

3

對於預初始化的數組,您不需要在括號中編寫數字。你可以只寫

char str[] = "this is my string"; 

而且編譯器會自動計算需要的字節數。

malloc,必須加1例:

char *strdup(const char *str) 
{ 
    char *ret = malloc(strlen(str) + 1); 
    strcpy(ret, str); 

    return ret; 
} 
+0

如果我想寫一個數字,我應該用6還是7? – Sato

+0

@Sato不要害怕嘗試一個在線編譯器:http://cpp.sh/9hhzp – stackptr

+0

@Sato你應該寫7分配一個由6個字符組成的字符串的內存,因爲你需要額外的一個字符來終止字符''\ 0'' –

0

您應該使用字符串長度+ 1,在你的情況,而在聲明字符數組必須使用7。 由於printf()顯示的未定義行爲,您提供的示例可能會有效。

0

除了stackptr的回答是:

如果您計劃覆蓋你的數組:

char str[30] = "abc"; 
... 
strcpy(str, "Hello world"); /* This will overwrite the content of "str" */ 

...數組的長度必須是字符串加1

的最大長度

在上述可能寫入最多爲29個字符長的串陣列的例子。

注意以下定義:所以你限制3個字符

char str[] = "abc"; 

...暗中創建4個字符長度的數組。