6

暗号化されたパスワードを生成するために使用したいだけで、メソッドcrypt()を呼び出すデモを書きます。crypt()これが私のコードです

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("%s\n",crypt("abc","ab"));
    exit(0);
}

を使用してコンパイルし"gcc tem.c -lcrypt'、実行すると、すべてが正しいように見えますが、「セグメントエラー」が表示されます。この単純なプログラムの何が問題なのか教えてください。

4

3 に答える 3

12

フラグ-Wallを付けてコンパイルすると、その理由がわかります。

マニュアルページを読むと、#define _XOPEN_SOURCE含める前に使用されていることがわかります<unistd.h>。実際には、ヘッダーを含める前に定義する必要があります

定義しない場合_XOPEN_SOURCEcrypt関数はプロトタイプ化されません。その場合、コンパイラは実際の戻り値の型が何であるか、または引数の型と数を知りません。そのため、関数が anintを返しprintf、文字列が期待されると想定されるため、クラッシュの原因となる型の不一致が発生します。

于 2013-03-21T14:07:36.903 に答える
5

あなたはこれを必要とします:

#define _XOPEN_SOURCE

ソースファイルの先頭で、#include.

または、gcc オプションでコンパイルします-D_XOPEN_SOURCE

于 2013-03-21T14:04:00.800 に答える
2

暗号ライブラリのサポートに関連しているようです。

追加してみてください:

#include <crypt.h>

[mstanislav@pardalislabs ~]$ gcc tem.c -lcrypt
[mstanislav@pardalislabs ~]$ ./a.out  
abFZSxKKdq5s6

私には良さそうです!

于 2013-03-21T14:04:43.687 に答える