2016-08-17 9 views
-1

このコードはCで書かれていますが、実行すると数行印刷した後にプログラムがクラッシュします。問題を解決してください。いくつかの行を印刷した後にCプログラムがクラッシュする

コード:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h> 


void main() { 

    char *str[] = {"Dog", "Cat", "Hen", "Goat"}; 
    char *sentence; 
    int i; 
    srand(time(NULL)); 

    for(i=0; i<20; i++) { 
     sentence = strdup(""); 
     strcat(sentence, str[rand()%4]); 
     strcat(sentence, str[rand()%4]); 
     strcat(sentence, str[rand()%4]); 
     printf("%s\n", sentence); 
    } 

} 
+0

'strcat'の最初の引数は、結果に十分なスペースが割り当てられたバッファを指します。 –

+0

私はそれを走らせて、それは私によってクラッシュしません。あなたがポインタを適切に割り当てていないときに未定義の振る舞いを呼び出したので、それがなぜクラッシュするのですか? – Mirakurun

+0

デバッグヘルプ(「なぜこのコードは動作しませんか?」)には、目的の動作、特定の問題またはエラー、および質問自体に再現するのに必要な最短コードが含まれている必要があります。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:最小、完全、および検証可能な例を作成する方法。 – Olaf

答えて

2

sentenceに文字列を格納するのに十分なメモリが割り当てられていなかったため、プログラムがクラッシュしました。

void main() { 

    char *str[] = {"Dog", "Cat", "Hen", "Goat"}; 
    char *sentence = NULL; //initialize the string 
    int i; 
    srand(time(NULL)); 

    for(i=0; i<20; i++) { 
     sentence=malloc(13); // longest string would be GoatGoatGoat + terminating null 
     sentence[0]='\0'; 
     strcat(sentence, str[rand()%4]); 
     strcat(sentence, str[rand()%4]); 
     strcat(sentence, str[rand()%4]); 
     printf("%s\n", sentence); 
     free(sentence); //always free the allocated memory 
    } 


} 
+1

'malloc()' edポインタが* indeterminate *の内容を持つ配列を指しているため、未定義の動作です。 'strcat()'は引数としてヌル終了文字列を必要とします。 – EOF

+1

代わりに 'calloc'を使う...最初の文字を' 0'に明示的に設定する。 @EugeneSh。 –

+0

最初の 'strcat()'の代わりに 'strcpy()'だけを使用してください。 – EOF

1
sentence = strdup(""); 

あなただけsentenceのための1 charを割り当てています。 3つすべての動物の名前(13 =最長の動物の名前の3倍、ヤギ+ 1のヌル文字)を格納するのに十分なメモリを割り当てる必要があります。また、文字列をゼロにするにはcallocを使用します。作業が完了したときにも、あなたのメモリを解放していない

sentence = calloc(13, sizeof(char)); /* CORRECT */ 

free(sentence); 

をところでそれが標準規格に準拠していないとして、あなたはvoid main()を使用しないでください。代わりにint main()を使用してください。

+0

実際には、毎回ランダムなものを選んでいるので、*最大*名前の長さの4倍のスペースを確保する必要があります。 –

+0

うん。 3、申し訳ありません。 –

+0

@chuxが 'calloc'を使用するように修正されました – stackptr

0

この場合、ループ内にメモリを割り当てて解放するのは悪い考えです。無害ですが、この場合は割り当てられたメモリを再利用する方がはるかに優れています。

また、mallocとfreeを使う必要はなく、代わりに固定長のchar配列を宣言することもできます。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h> 

int main() 
{ 
    char *str[] = {"Dog", "Cat", "Hen", "Goat"}; 
    char sentence[64]; 
    int i; 

    srand(time(NULL)); 

    for(i = 0; i < 20; i++) 
    { 
     strcpy(sentence, str[rand() % 4]); 
     strcat(sentence, str[rand() % 4]); 
     strcat(sentence, str[rand() % 4]); 
     printf("%s\n", sentence); 
    } 
    return 0; 
} 
関連する問題