使用ctypes打印常量字符串会导致segfault

时间:2018-07-26 10:12:33

标签: python ctypes

我正在从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:没有这样的文件或目录。

1 个答案:

答案 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'