这里有人能举例说明如何使用函数crypt_r()?
从手册页中,不清楚返回的char *字符串是指向函数本身内部(在堆中)分配的内存块,还是指向静态内存,如crypt()?
答案 0 :(得分:6)
来自GNU手册:
crypt_r函数与crypt的功能相同,但需要额外的功能 参数包括其结果的空间(等等),所以 它可以是可重入的。 data-> initialized必须先清零 第一次调用crypt_r。
Kernel.org提供了更多详细信息:
crypt_r()是crypt()的可重入版本。结构指向 数据用于存储结果数据和簿记信息。 除了分配它之外,调用者应该做的唯一事情 使用这种结构是在数据之前将data->初始化为零 首先调用crypt_r()。
crypt
和crypt_r
都返回指向加密密码的指针。当然,如果您使用crypt_r
,那么内存将位于您传递的crypt_data
内。
struct crypt_data data;
data.initialized = 0;
char *enc = crypt_r(key, salt, &data);
printf("EncryptedL %s\n", enc);
答案 1 :(得分:1)
GNU函数的_r
版本的重点是使它们可重入(在这种情况下是线程安全的);消除非_r版本使用的内部静态缓冲区并返回指针。
返回的char*
指向您分配和传入的数据结构。
答案 2 :(得分:1)
#define _GNU_SOURCE
#include <crypt.h>
#include <stdio.h>
int main(void) {
struct crypt_data data[1] = {0};
char *res;
res = crypt_r("password", "QX", data);
printf("return value from crypt_r was %s\n", res);
return 0;
}
在我的系统上使用gcc版本4.6.2进行编译
gcc crypttest.c -lcrypt
结果是
return value from crypt_r was QXZx61KdaYegc