0

どこが間違っているのか、なぜですか?

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

int main()
{
char *str;
int length, i, j, flag = 0;

printf("\n\nEnter string: ");
fgets(str, 20, stdin);
printf("You entered: %s", str);
    return 0;
}

ラインラインに問題がありfgets(str, 20, stdin);ます。私はそれを把握することはできません。文字列を入力した後、コンパイラは動作を停止し、次のエラーが表示されます: This program has stopped working . どこが間違っているのか、またこの問題の回避策を教えていただけますか? 標準ライブラリでは次のように定義fgetsされています。

char * fgets ( char * str, int num, FILE * stream );

MinGW shell でSublime Text 2GCCを使用しています。

ポインターの概念に基づく別の質問: と の間char * strに違いはchar* strありchar *strますか?

4

3 に答える 3

4

メモリを割り当てる必要がありますstr

どのサイズも128と言います。

char *str = malloc(128*sizeof(char));

また

char str[128];

于 2013-08-12T18:20:39.517 に答える
1

にメモリが割り当てられていませんstr。ヒープ割り当て用またはスタック割り当て用char *strに置き換えます。char *str = malloc(20);char str[20]

-をどこに置くかは問題ではありません*。3 つのステートメントはすべて同じです。

PS Sublime Text 2 は単なるテキスト エディターであり、どのテキスト エディターを使用してもプログラムには影響しません。ただし、コンパイラと OS は重要です。

于 2013-08-12T18:19:29.857 に答える
1

という名前の変数にメモリを割り当てていないため、投稿したコードはエラーをスローしますstr。私はそれに任意のメモリ位置を与えているだけです。

したがって、上記のコードが正しく機能するためには、スタックまたはヒープにメモリを割り当てることができます。

スタックに割り当てるには、 と を使用char str[20]し、ヒープにメモリを割り当てるには、char *str = malloc(20)またはを使用しますchar *str = malloc(20*sizeof(char))

スタックやヒープのことを知らなくても、あまり詳細を気にする必要はありません。それらのどれも、単純なコンソール プログラムに適しています。

私の他の質問については、*in char* strchar * strandの位置は関係ありchar *strません。それらの3つすべてが同じです。

@P0W の回答に関連して私が尋ねたもう 1 つの質問は、 in によって返されるメモリ アドレスをキャストしない理由mallocですchar *str = malloc(20*sizeof(char))。この質問に対する答えは、C では不要であり、回避する必要があるということです。stdlib.hヘッダー ファイルをインクルードして、回避策を取得してください。

詳細については、このStackOverflow の質問を確認してください。または、C FAQ セクションを表示することもできます。

于 2013-08-12T18:53:54.660 に答える