g++;:分段故障(堆芯转储) 我在C++中有一个叫SooSc.cp的代码。我有一个C语言库。我使用Cygwin并运行:g++source.cpp-L/cygdrive/C/Cygwin/home/Win7/libpaillier-L:libpaillier.a-lgmpxx-lgmp创建一个.exe文件,然后运行它。最后我得到了“分段错误(堆芯转储)”。我需要知道为什么我会犯这个错误

g++;:分段故障(堆芯转储) 我在C++中有一个叫SooSc.cp的代码。我有一个C语言库。我使用Cygwin并运行:g++source.cpp-L/cygdrive/C/Cygwin/home/Win7/libpaillier-L:libpaillier.a-lgmpxx-lgmp创建一个.exe文件,然后运行它。最后我得到了“分段错误(堆芯转储)”。我需要知道为什么我会犯这个错误,c++,g++,cygwin,implementation,C++,G++,Cygwin,Implementation,Source.cpp: #include<iostream> #include<gmp.h> #include <gmpxx.h> using namespace std; #include <string> extern "C"{ #include<paillier.h> } #include<math.h> #include <stdio.h> #include <stdlib.h> int

Source.cpp:

#include<iostream>
#include<gmp.h>
#include <gmpxx.h>

using namespace std;

#include <string>
extern "C"{
#include<paillier.h>
}
#include<math.h>
#include <stdio.h>
#include <stdlib.h>

int main(){
    paillier_pubkey_t* pu;//The public key
    paillier_prvkey_t* pr;//The private key 
    paillier_get_rand_t get_rand;
    paillier_keygen(1024, &pu,&pr, get_rand );
    return 0;
}
#包括
#包括
#包括
使用名称空间std;
#包括
外部“C”{
#包括
}
#包括
#包括
#包括
int main(){
paillier\u pubkey\u t*pu;//公钥
paillier\u prvkey\u t*pr;//私钥
佩利尔得到了,但没有得到;
佩利尔·凯根(1024,&pu,&pr,格特兰);
返回0;
}


Paillier库:

您声明了一个指向随机函数的指针(
Paillier\u get\u rand\u t get\u rand;
),但尚未将其初始化为指向函数。现在,当您将此指针传递到试图调用它(应该)指向的函数的
paillier\u keygen
时,您将得到一个segfault

正如@TartanLlama所提到的,该库提供了两个随机数生成函数,您可以使用它们初始化指针(或直接将它们传递给函数):
paillier\u get\u rand\u devrandom
paillier\u get\u rand\u devurandom

您还可以使用另一个RNG函数。只需确保它的头与所讨论的函数指针类型兼容:
typedef void(*paillier_get_rand_t)(void*buf,int len)()。此外,您希望它符合库的要求,即生成
len
字节的随机字节序列,并将其存储在
buf


编辑:我最初误读了您的代码,这就是为什么我谈到了几个指针

您需要将有效的随机生成器作为最后一个参数传递给
paillier\u keygen
。该库提供了两种可供使用的功能:

paillier_keygen(1024, &pu,&pr, paillier_get_rand_devrandom);
paillier_keygen(1024, &pu,&pr, paillier_get_rand_devurandom);

您是否尝试过使用调试器?函数
paillier\u keygen
需要一个有效的函数指针作为其最后一个参数。文档建议您选择两个。我是cygwin的新手,您能告诉我怎么做吗?您是否签出了此()文件?库函数将分配它们。