我正在从c函数返回常量字符串。当我尝试打印时使用ctypes 这导致了段错误。我认为因为它是一个常量字符串,所以我不是 需要显式分配内存。我的假设正确吗?
test.c:
char *str = "constant string";
char* get_str()
{
return str;
}
test.py:
import os
import sys
import ctypes
from ctypes import *
lib = CDLL('./libtest.so')
s = lib.get_str()
s = ctypes.cast(s, c_char_p)
print(s.value)
程序收到信号SIGSEGV,分段错误。 在../sysdeps/x86_64/strlen.S的strlen():S:106 106 ../sysdeps/x86_64/strlen.S:没有这样的文件或目录。
答案 0 :(得分:1)
您必须按照[Python]: ctypes - A foreign function library for Python中的说明正确指定函数的restype
(和argtypes
)。
test.py :
import sys
import ctypes
LIB_NAME = "./libtest.so"
def main():
libtest_lib = ctypes.CDLL(LIB_NAME)
get_str_func = libtest_lib.get_str
get_str_func.atgtypes = []
get_str_func.restype = ctypes.c_char_p
s = get_str_func()
print(s)
if __name__ == "__main__":
print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
main()
输出:
[cfati@cfati-ubtu16x64-0:~/Work/Dev/StackOverflow/q051536391]> python3 ./test.py Python 3.5.2 (default, Nov 23 2017, 16:37:01) [GCC 5.4.0 20160609] on linux b'constant string'