-6

ケース 1: 文字列入力を取得すると、次のコードを記述して、正常に出力されます。

#include <stdio.h>
int main()
{
    char *str;
    scanf("%s",&str);
    printf("%s",&str);
    return 0;
}

ケース 2: 一方、このスニペットのランタイム エラーがスローされます。

#include <stdio.h>
int main()
{
    char *str;
    scanf("%s",&str);
    printf("%s",str);
    return 0;
}

私はこれが奇妙なことに気づき、なぜそれが起こるのかを知りたい. 前もって感謝します.

4

1 に答える 1

2

これらの 2 つのケースはいずれも正しくありません。

ケース 1 は、おそらく入力として短い文字列を与えることによって、ラッキーになったためにのみ機能しました。のようなものを試してみる"bfjabfabjkbfjkasjkvasjkvjksbkjafbskjbfakbsjfbjasbfjasbfkjabsjfkbaksbfjasbfkja"と、おそらくセグフォルトが発生します。

に関連付けられたメモリのブロックが必要です。strこれは、配列を宣言してスタック上に配置するか、ヒープmalloc'ing メモリ上に配置する必要があります。

&また、演算子は使用しないでください。

したがって、次のようになります。

#include <stdio.h>
int main()
{
    char str[50];   // 50 is arbitrary
    scanf("%s",str);
    printf("%s",str);
    return 0;
}

またはこのように:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char* str = malloc(50);   // 50 is arbitrary
    scanf("%s",str);
    printf("%s",str);
    free(str);
    return 0;
}
于 2016-11-30T22:22:15.630 に答える