2017-04-10 133 views
-4

我寫這樣的函數,當參數x是即使我在主輸入printf("%s",maxCharac(2))它會打印AA和一個額外的字符旁邊不作爲期望的工作,例如,但是奇數時它可以正常工作。指針函數返回值爲false

char *maxCharac(int x) 
{ 
    char *str=(char*)malloc(sizeof(char)*x); 
    for(int i=0;i<x;i++) 
    {    
     str[i]='a'; 
    } 
    return str; 
} 
+0

[請參閱爲什麼不投的malloc''中的C'返回值()'和家人討論](http://stackoverflow.com/q/605845/ 2173917)。 –

+4

你必須null結束它。在'for'循環後添加這行,並在'malloc'行中加上'+ 1'。 'str [x] = NULL;' – imreal

+1

你的字符串必須是null-termante,所以你需要在字符後加一個額外的字節。 – LPs

回答

3

C字符串是NUL終止,所以

char *maxCharac(int x) 
{ 
    char *str = malloc(x + 1); 

    if (str != NULL) 
    { 
     for (int i = 0; i < x; i++) 
     { 
      str[i] = 'a'; 
     } 
     str[i] = '\0'; 
    } 

    return str; 
} 

正如你可以看到:

  1. 您必須留有餘地,一個空終止'\0'malloc(x + 1);
  2. sizeof(char)永遠是1元的標準
  3. 必須檢查malloc&co返回值!= NULL使用前。

或者,以避免最後一條指令就可以使用calloc是歸零分配的內存

char *maxCharac(int x) 
{ 
    char *str = calloc(x + 1, 1); 

    if (str != NULL) 
    { 
     for (int i = 0; i < x; i++) 
     { 
      str[i] = 'a'; 
     } 
    } 

    return str; 
} 

最後一件事,因爲每個函數,調用者必須檢查函數的返回值,以確保不使用可能NULL指針返回:

int main(void) 
{ 
    char *str = maxCharac(2); 

    if (str != NULL) 
    { 
     printf("Test: %s\n", str); 
    } 
} 
+0

@SinanÜnür感謝您的編輯並對我的英語感到抱歉;) – LPs

2

你是不是爲你的字符串分配足夠的存儲空間,你需要一個額外的字符空終止它,所以你要分配一個額外這樣 並確保最後一個字符是一個NUL 。

char *str=(char*)malloc(sizeof(char)*(x+1)); 
for(int i=0;i<x;i++){ 
    str[i]='a'; 
} 

str[x]='\0'; 

結尾沒有多餘的空字符,您遇到不確定的行爲 - 你的代碼會繼續讀超過字符串的結尾,直到它遇到一個NULL字符。你看到一個x在正確的點終止你的字符串是奇怪的是純粹的運氣。

+0

嚴格地說[tag:c]說'malloc'返回是不需要的。 – LPs

+0

請勿施放'malloc'的返回值。 'sizeof(char)'***根據定義***總是1. –

+0

@LPs我知道這不是必需的,但它是在原始代碼中,所以我把它留在原來的位置,只糾正那些肯定錯誤的部分 –