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

如何用ctypes将Python浮点嵌套列表转为C double**?遇IndexError报错

Python二维列表转C double**指针(解决IndexError)

错误原因

你之前的代码试图直接创建连续二维c_double数组,但初始化时传入了嵌套元组,不符合该类型的参数要求,导致索引错误。另外,连续二维数组和C语言的double**(指针的指针)不是同一类型,若需要的是double**,得用指针数组的方式构建。

正确实现(转double**)

如果需要对应C的double**类型,需分两步构建:先将每个子列表转为独立的c_double数组,再将这些数组的指针存入指针数组:

import ctypes

lst = [[1.0, 1.0, 1.0, 1.0], [2.0, 2.0, 2.0, 2.0], [3.0, 3.0, 3.0, 3.0]]

# 1. 转换每个子列表为c_double数组
row_arrays = []
for sublist in lst:
    row = (ctypes.c_double * len(sublist))(*sublist)
    row_arrays.append(row)

# 2. 创建指针数组,存储子数组的地址
ptr_array = (ctypes.POINTER(ctypes.c_double) * len(row_arrays))(*row_arrays)

# 转为double**类型
c_dbl_ptr = ctypes.cast(ptr_array, ctypes.POINTER(ctypes.POINTER(ctypes.c_double)))

可选:转连续二维数组(对应C的double[M][N])

如果你的C函数接受的是连续内存的二维数组而非double**,可以用扁平化列表初始化:

import ctypes

lst = [[1.0, 1.0, 1.0, 1.0], [2.0, 2.0, 2.0, 2.0], [3.0, 3.0, 3.0, 3.0]]

# 扁平化列表
flat_elements = [num for sublist in lst for num in sublist]
# 创建连续二维数组
c_contiguous_array = (ctypes.c_double * len(lst) * len(lst[0]))(*flat_elements)

内容的提问来源于stack exchange,提问作者willaayy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:33:14