1

重複の可能性:
scanf を使用したセグメンテーション違反

ユーザーからパスワードを受け入れて出力するCプログラムを実行しようとしています。しかし、プログラムを実行すると、「Segmentation Fault (core dumped)」というメッセージが表示されます。この障害は、配列がスタック サイズを超えているように見える場所で発生することはわかっていますが、どこが間違っているのかわかりません。どんな助けでも大歓迎です。コードは次のとおりです。

int main(int argc, char *argv[])
{
    int i = 0;
    char *password, *key;

int keylength = 256;

    printf("\nPlease enter a password: ");
    scanf(" %[^\n]", &password);
    printf("Entered password is: %s", password);
    return 0;
}
4

3 に答える 3

7

にメモリを割り当てていませんpassword。これは単なる初期化されていないポインタです。C では、ポインターを使用する前に、ポインターが有効な割り当てられたメモリ バッファーを指していることを常に確認する必要があります。初期化されていないポインターを使用すると、未定義の動作が発生し、通常はクラッシュが発生します。

(1)スタック配列としてpassword宣言することにより、メモリを割り当てます。password

char password[1024];

または(2)、次を使用してメモリバッファを割り当てますmalloc

char *password = malloc(1024);

を使用する場合はmalloc、割り当てたものはすべてmalloc、対応する への呼び出しで割り当てを解除する必要があることに注意してくださいfree

また、投稿したコードでは、バッファを に渡すと、と言うとポインタ自体のアドレスscanfを取得しています。やりたいことは、次のように、ポインター (割り当てられたバッファーを参照するメモリアドレス) を渡すだけです。&password

scanf(" %[^\n]", password);

&beforeがないことに注意してくださいpasswordpasswordはポインタなので必要ありません。&前に配置すると、ポインタをポインタにpassword渡すことになりますが、これは望ましくありません。 最後に、C でプログラミングする場合、バッファ オーバーフローは常に危険であることに注意してください。 プログラムのユーザーがバッファーに収まる以上のデータを入力するのを防ぐために何もしません。これが発生すると、バッファ オーバーフローが発生し、プログラムは未定義の動作を示します (おそらくクラッシュします)。など、ユーザーから文字列入力を取得するより安全な方法があります。

scanffgets

于 2013-01-24T17:38:49.343 に答える
2

password単一化されたポインターです。彼は糸を保持することはできません。この変数に書き込もうとすると、未定義の動作が発生します。以下に 2 つの解決策を示します。

char password[SIZE];

/* or */

char *password = malloc(size);
于 2013-01-24T17:38:57.973 に答える
1

ポインターを作成しましたpasswordが、初期化していません。

これは、この場合、たまたまスタック上にあったものは何でも、ポインターにランダムな値が含まれていることを意味します。ポインターを逆参照すると、そのランダムなアドレスでメモリにアクセスしようとしています。これはあなたが望むものではなく、セグメンテーション違反などの問題を引き起こす可能性が非常に高くなります。

于 2013-01-24T17:39:17.047 に答える