diff --git a/gmp_big.go b/gmp_big.go
index 555fc5d7bed1ebfcbd83f7fe73931f8cc9d3954e..8640831d2cdf3c1c55d29443df16ba361d37e09e 100644
--- a/gmp_big.go
+++ b/gmp_big.go
@@ -23,6 +23,17 @@ package pbc
 
 /*
 #include <gmp.h>
+#include <stdlib.h>
+
+mpz_t* newMpzT() {
+	mpz_t* x = malloc(sizeof(mpz_t));
+	mpz_init(*x);
+	return x;
+}
+void freeMpzT(mpz_t* x) {
+	mpz_clear(*x);
+	free(x);
+}
 */
 import "C"
 
@@ -33,19 +44,19 @@ import (
 )
 
 type mpz struct {
-	i C.mpz_t
+	i *C.mpz_t
 }
 
 var wordSize C.size_t
 var bitsPerWord C.size_t
 
 func clearMpz(x *mpz) {
-	C.mpz_clear(&x.i[0])
+	C.freeMpzT(x.i)
 }
 
 func newMpz() *mpz {
 	out := &mpz{}
-	C.mpz_init(&out.i[0])
+	out.i = C.newMpzT()
 	runtime.SetFinalizer(out, clearMpz)
 	return out
 }
diff --git a/rand_hook.c b/rand_hook.c
index f0d3a42dff112637275a61388073ac369070cc48..228d8c005f421fc28a384beed9b1d79baa827ca7 100644
--- a/rand_hook.c
+++ b/rand_hook.c
@@ -26,7 +26,7 @@ void pbc_init_random();
 
 void goRandomHook(mpz_t out, mpz_t limit, void* data) {
 	UNUSED_VAR(data);
-	goGenerateRandom(out, limit);
+	goGenerateRandom(&out, &limit);
 }
 
 void installRandomHook() {
diff --git a/utils.go b/utils.go
index 1af0252d79d073e85a79b18ed49b342091a785e8..2f36c1da4daabcef30547adc333bd1a98df800b1 100644
--- a/utils.go
+++ b/utils.go
@@ -81,8 +81,8 @@ func SetRandomProvider(provider RandomSource) {
 
 //export goGenerateRandom
 func goGenerateRandom(out, limit unsafe.Pointer) {
-	outMpz := &mpz{i: *(*C.mpz_t)(out)}
-	limitMpz := &mpz{i: *(*C.mpz_t)(limit)}
+	outMpz := &mpz{i: *(**C.mpz_t)(out)}
+	limitMpz := &mpz{i: *(**C.mpz_t)(limit)}
 	r := randomProvider.Rand(mpz2big(limitMpz))
 	big2thisMpz(r, outMpz)
 }