今天工作很安静,因此团队被指示进行一些"self 发展".我决定从Python中调用C个功能来玩一些乐趣.我已经很高兴使用Rust来加速Python,但每当我想处理大于u128
类型所能容纳的整数时,我总是碰壁.我认为通过使用C著名的GMP库,我可以克服这个问题.
到目前为止,我已经成功地构建了一个运行的最小C程序,它似乎可以做我想要的事情,而且在我看来,它没有任何明显的问题.这是我的代码:
#include <stdio.h>
#include <gmp.h>
#define BASE 10
void _factorial(int n, mpz_t result) {
int factor;
mpz_t factor_mpz;
mpz_init(result);
mpz_init_set_ui(result, 1);
for (factor = 1; factor <= n; factor++) {
mpz_init(factor_mpz);
mpz_init_set_ui(factor_mpz, factor);
mpz_mul(result, result, factor_mpz);
mpz_clear(factor_mpz);
}
}
char *factorial(int n) {
char *result;
mpz_t result_mpz;
_factorial(n, result_mpz);
mpz_get_str(result, BASE, result_mpz);
mpz_clear(result_mpz);
return result;
}
int main(void) { // This runs without any apparent issues.
char *result = factorial(100);
printf("%s\n", result);
return 0;
}
然后我try 从Python中这样调用它:
from ctypes import CDLL, c_void_p, c_char_p, c_int32, cast
CLIB = CDLL("./shared.so")
cfunc = CLIB.factorial
cfunc.argtypes = [c_int32]
cfunc.restype = c_char_p
raw_pointer = cfunc(100)
result = raw_pointer.decode()
print(result)
我使用以下命令将C代码编译为.so文件:
gcc main.c -lgmp -fpic -shared -o shared.so
然后我运行了上面的Python脚本,但不幸的是遇到了两个问题:
- 尽管它达到了
print()
个陈述并打印正确的结果,但它随后会达到segmentation fault. - 我担心,在将任意长度的字符串从C传递到Python时,可能会出现一些内存泄漏.
有人知道如何克服分段错误吗?如果确实存在内存泄漏,如何堵住它?