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_SOURCE,则该crypt函数将不会被原型化。然后编译器不知道实际的返回类型是什么,或者参数的类型和数量。所以它会假设函数返回一个int并且你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 回答