我正在使用
ctype
从 Python 调用 C 代码。
我需要调用的 C 函数采用
char***
,因此它是使用 ctypes.POINTER(ctypes.POINTER(ctypes.c_char))
进行绑定的。
我不明白应该如何安全地创建和初始化此类对象,因为如果我创建一个对象并立即尝试迭代它,Python 程序就会崩溃:
import ctypes
names = ctypes.POINTER(ctypes.POINTER(ctypes.c_char))()
if names != None:
for name in names:
pass
错误是:
Traceback (most recent call last):
File "example_sdetests_lib_bind_python_string_array.py", line 6, in <module>
for name in names:
ValueError: NULL pointer access
如何安全地检查
ctypes.POINTER(ctypes.POINTER(ctypes.c_char))
是否为 NULL?
仅供参考:
char***
需要三个ctypes.POINTER
。
要测试 null,取消引用它并捕获异常:
import ctypes as ct
# define char*** type
PPPCHAR = ct.POINTER(ct.POINTER(ct.POINTER(ct.c_char)))
# instantiate (default null)
names = PPPCHAR()
if not names:
print('NULL')
# Simple initialization
c = ct.c_char(b'a')
# pointer(obj) creates a ctypes pointer instance to a ctypes object.
pc = ct.pointer(c)
ppc = ct.pointer(pc)
pppc = ct.pointer(ppc)
if pppc:
print('non-NULL')
print(pppc.contents.contents.contents)
输出:
NULL
non-NULL
c_char(b'a')