如何正确初始化ctypes char***?

问题描述 投票:0回答:1

我正在使用

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?

python ctypes python-bindings
1个回答
0
投票

仅供参考:

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')
© www.soinside.com 2019 - 2024. All rights reserved.