2

私は次のように書いた:

#include <stdio.h>
#include <string.h>
char* getString();

char* getString(){
    char str[10];
    gets(str);
    return str;

}

int main() {

    char* s;
    s=getString();
    strcpy(s,"Hi");
    puts(s);
    return 0;
}

の長さがstr10 未満でなければならないことはわかっていますが、「こんにちは」とだけ書いても何も出力されませんでした。私が見る限り、それは大丈夫なはずです。コンパイラはそれを言いfgets is dangerous and should not be usedます。

画面に何も印刷されない理由は何ですか?

4

4 に答える 4

6
char str[10];
// ...
return str;

これは間違っています!!! スコープが終了すると、ローカル変数は無効になります。したがって、返された配列の使用は未定義の動作です。文字列を malloc して返す必要があります。

return strdup(str);
于 2012-07-17T06:50:32.390 に答える
3

結果に関する問題はすでに議論されています。実行できるソリューションのリストは次のとおりです。

1)。str をグローバルに "char str[10]" として定義し、それを関数 main および getString で使用します

2)。関数getStringでmalloc/callocを使用すると、コードは次のようになります...

char* getString(){
char *str = NULL;
str = (char *)calloc(10, sizeof(char));
gets(str);
return str;
}

int main() {
    char* s;
    s=getString();
    strcpy(s,"Hi");
    puts(s);
    free(s);
    return 0;
}`

3)。準備が整ったヘルプには static を使用します。しかし、それは概念的に正しいアプローチではありません

たとえば、関数 getString で次のように宣言します。

static char str[10];
于 2012-07-17T07:14:48.900 に答える
1

コードを機能させる最も簡単な方法は、必ずしも最善の方法ではありませんが、str静的にすることです。

すなわち

static char str[10];
于 2012-07-17T06:53:12.210 に答える
0

Wellは、スタックstr[10]に割り当てられた 10 文字の配列です。関数がスコープ外になった後、スタックは削除されます。したがって、関数によって返されたアドレスは無効になります。getString()

ポインタを宣言し、char *strメモリを動的に割り当てることを検討してくださいmalloc。これで変数は、関数の実行が終了した後も残り続けるヒープ内の場所を指します。

それがあなたの質問に答えたことを願っています

于 2012-07-17T07:26:48.740 に答える