【问题标题】:Ctype return type for a c functionc函数的Ctype返回类型
【发布时间】:2013-02-18 04:31:16
【问题描述】:

我有一个 C 函数如下:

char* hash_id_G1(char *str){
char hash[20];
...
return hash;
}

我需要的是一些类似这里的函数,它们将接收一个 char 数组并返回一个 char 数组或指向该 char 的指针。

我会将这些编译成一个共享的so并使用ctypes将其导入python。

这就是我到目前为止所做的:

from ctypes import *
ibc = cdll.LoadLibrary('./libibc.so.1.0.1')
strin = 'sometext to hash'
ids = (c_char * 40)()
ids.value = strin
hash = c_char_p
hash_id = ibc.hash_id_G1
hash_id.restype = c_char_p
hash = hash_id(ids)

该库运行良好,但我无法设置 restype。当我这样做时,代码会因段错误而崩溃。

我需要从python中一一调用c库中的函数。这些函数通常返回加密。如何定义这些函数,以便它们接受来自 ctype 接口的字符串并以某种可存储的形式返回加密?

感谢任何帮助。我对 C 指针和相关的东西非常薄弱。提前致谢

更新

分段错误是因为编译错误。如果函数要返回一个无符号字符,我将如何在 C 中声明 ctype 变量?

【问题讨论】:

  • hash_id_G1() 函数返回什么?它是一个以 null 结尾的字符串,还是一个已知大小的固定字符串?在后一种情况下,您需要将 restype 声明为 POINTER(c_char * 40)
  • 我已经更新了代码@armin。如图所示,它返回指向 char 数组的指针。
  • 似乎分段问题是由于编译时的一些错误选项造成的。该代码产生预期的结果。我已经更新了我的帖子。
  • 该函数表现出未定义的行为,因为您返回一个指向临时对象的指针。您可以预期这种代码会出现段错误。

标签: python c pointers ctypes


【解决方案1】:

不要这样传递你的论点;它容易出错且不惯用(因此难以阅读)。您只需执行以下操作:

from ctypes import *

ibc = cdll.LoadLibrary('./libibc.so.1.0.1')
ibc.hash_id_G1.restype = c_char_p
hash = ibc.hash_id_G1(c_char_p('sometext to hash'))

除此之外,您正在处理未定义的行为,因为您正在返回一个指向局部变量的指针。局部变量只存在于它们被声明的范围内;在该范围之外访问它们可以做任何事情,从返回虚假结果到段错误。如果更改编译器选项阻止您的代码出现段错误,那只能靠运气了。

解决这个问题的方法是声明你的数组static,这样即使在hash_id_G1的范围之外它也会持续存在...

char *hash_id_G1(char *str)
{
    static char hash[20];
    ...
    return hash;
}

...或显式分配内存。

char *hash_id_G1(char *str)
{
    char *hash = malloc(20);
    ...
    return hash;
}

第一个选项不是线程安全的(这对您的应用程序来说可能不是问题),第二个选项要求您之后自己 free 内存(或接受少量内存泄漏)。

至于你的新问题,read the documentation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多