这是previous question的后续问题(现在实际问题不同了):
int main()
{
mpz_t p, q, n, phi_n, e, d;
mpz_inits(p, q, n, phi_n, e, d, NULL);
generate_pq(p,q);
compute_n(n,p,q);
compute_phiN(phi_n,p,q);
mpz_clear(p,q,NULL);
select_e(e,phi_n);
compute_d(d,e,phi_n);
mpz_clear(phi_n);
mpz_t* m;
int size=0;
store_m(m,size);
mpz_t* c;
encrypt(c,m,size,e,n);
return 0;
}
以下是相关功能:
void store_m(mpz_t m[], int& size)
{ /* m = original message */
printf("\nMessage: ");
char* buffer = new char[128];
cin.getline(buffer,128);
size = strlen(buffer); //size = buffer
m = new mpz_t[size];
for(int i=0; i<size; i++) {
mpz_init(m[i]);
mpz_set_ui(m[i],(int)buffer[i]);
}
delete buffer;
}
void encrypt(mpz_t*& c, mpz_t m[], const int size,
const mpz_t e, const mpz_t n)
{ /* c = cipher */
cout << "1" << endl;
c = new mpz_t[size];
cout << "2" << endl;
for(int i=0; i<size; i++) {
cout << "3" << endl;
mpz_init(c[i]);
cout << "4" << endl;
mpz_powm(c[i],m[i],e,n);
cout << "5" << endl;
mpz_clear(m[i]);
cout << "6" << endl;
} /* c = m^e(mod n) */
cout << "7" << endl;
}
当我执行时,程序进入加密()但在第4个cout处出现故障。
答案 0 :(得分:1)
记住C ++是按值传递的,除非您明确表示您使用&
运算符通过引用传递。在store_m()
中,您正在分配并分配给函数内的m
。由于您按值传递m
,因此无效。因此,main()
函数永远不会看到m
的分配,因为store_m()
只有m
的本地副本。因此,您将未初始化的变量传递给encrypt()
。在m
中分配main()
或像这样声明store_m()
:
void store_m( mpt_t*& m, int& size);
BTW:你不是在第4 cout
分段。在encrypt()
函数准备调用mpz_powm()
之后,您就会立即进行分段。实际崩溃是取消引用m[i]
(因为m
是单元化的。)