2017-04-10 4 views
-4

パラメータxがそれでもうまくいきません。たとえば、私がprintf("%s",maxCharac(2))をmainに入力すると、aaとその隣に余分な文字が表示されます。奇数では正しく動作します。偽の値を返すポインタ関数

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

を[C ' 'に戻り'のmalloc() 'の値と家族をキャストするではない理由でこの議論を参照してください。](http://stackoverflow.com/q/605845/ 2173917)。 –

+4

あなたはそれを終わらせなければなりません。この行を 'for'ループの後に追加し、' malloc'行に '+ 1 'を追加してください。 'str [x] = NULL;' – imreal

+1

文字列をnull-termanteしなければならないので、文字の後ろに余分なバイトが必要です。 – LPs

答えて

3

C文字列はそう

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; 
} 

、終了NULです:

  1. あなたはnull終端'\0'malloc(x + 1);
  2. sizeof(char)のための余地を残しておく必要があります常に1標準
  3. あたりです
  4. あなたチェックmalloc&co戻り値!= NULLを使用してください。

あるいは、割り当てられたメモリ

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; 
} 

最後のものをゼロにあなたがcallocを使用することができ、最後の命令を回避するために、機能ごとに、呼び出し側は、可能なを使用しないように保証するために、関数の戻り値をチェックする必要がありますNULLポインタが返さ:

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

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

@SinanÜnürあなたの編集のおかげで、私の英語のために申し訳ありません;) – LPs

2

あなたがそれをNULLで終了するために余分な文字を必要としてあなたは、文字列のための十分なメモリを割り当てていないので、この のように1つの余分を割り当てても、最後の文字はNULであることを確認します。最後に余分なNUL文字なし

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

str[x]='\0'; 

、あなたは未定義の動作を経験している - それはNUL文字に遭遇するまで、あなたのコードは、文字列の終わりを超えて読み続けます。 xがあなたのストリングを終わらせるために正しいポイントで奇妙なときあなたが1つを見ていることは純粋な運です。あなたが見ることができるように

+0

厳密に[タグ:c]「malloc」のキャストを話すのは必須ではありません。 – LPs

+0

'malloc'の戻り値をキャストしないでください。 'sizeof(char)'は定義*** ***です。常に1です。 –

+0

@LPs私はそれが必須ではないことを知っていますが、それは元のコードにあったので、間違っていた部分だけを修正しました。 –

関連する問題