You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python ctypes读取以NUL结尾的NUL终止字符串数组(以Ghostscript的gs_error_names为例)

如何用Python ctypes读取以NUL结尾的NUL终止字符串数组(以Ghostscript的gs_error_names为例)

嘿,这个场景我之前处理过,其实核心思路就是遍历数组直到遇到NULL(空指针)为止,毕竟这类以NUL结尾的数组,最后都会用一个空指针来标记结束。咱们结合你已经掌握的内容,一步步实现:

首先,先回顾下你已经写的代码——你已经能成功加载Ghostscript库,并且能获取单个字符串或者固定数量的数组元素,这已经打好基础了。接下来要做的就是自动遍历到数组末尾。

解决方案代码

这里有个简洁的实现方式,直接把gs_error_names当成指向字符串指针的数组来处理,然后循环读取直到遇到空指针:

from ctypes import *
from ctypes.util import find_library

# 加载Ghostscript动态库
gs = CDLL(find_library("gs"))

# 将gs_error_names声明为指向char*的指针(对应C语言里的char**类型)
error_names_array = POINTER(c_char_p).in_dll(gs, "gs_error_names")

# 用来存储所有读取到的错误名称
error_names = []

index = 0
while True:
    # 逐个获取数组中的字符串指针
    current_str_ptr = error_names_array[index]
    # 遇到空指针(NULL)就终止循环
    if current_str_ptr is None:
        break
    # 将C风格的字节串解码为Python字符串(编码可根据实际情况调整,比如latin-1)
    error_names.append(current_str_ptr.decode("utf-8"))
    index += 1

# 打印结果看看
for name in error_names:
    print(name)

为什么这样可行?

  • gs_error_names在C语言里是char**类型,也就是一个存储字符串指针的数组,最后以NULL(空指针)结尾。
  • 用POINTER(c_char_p)来适配这个类型,就可以通过索引直接访问数组里的每个字符串指针。
  • 当指针的值为None时,就说明已经到了数组的末尾,这时候停止遍历就行。

补充说明

  • 关于编码:如果Ghostscript的错误名称用的不是UTF-8编码,可以调整decode的参数(比如换成latin-1),根据实际情况适配。
  • 如果你想用更底层的内存地址操作方式,也可以通过计算指针偏移来遍历,但上面的方式已经足够简洁易读了。

备注:内容来源于stack exchange,提问作者mara004

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 09:23:07