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

Python中使用ctypes的Structure传参时赋值c_char_p报错求助

嘿,这个问题我刚接触ctypes的时候也踩过坑,很典型的类型不匹配问题,我来给你拆解一下~

解决ctypes中Structure的c_char_p赋值报错问题

错误原因

你碰到的TypeError: bytes or integer address expected instead of str instance,核心原因是:ctypes的c_char_p对应C语言里的char*,它要求的是字节类型(bytes)或者内存地址,而你直接传入了Python的字符串(str,Unicode类型),两者类型不兼容导致报错。

修正方法

只需要把Python字符串转换成字节对象就行,用字符串的encode()方法(默认utf-8编码,可根据你的需求调整编码格式),然后再赋值给c_char_p类型的字段。

完整修正代码

from ctypes import Structure, c_char_p, c_int

Time = "AuditSuccess"

class SecurityVarToCdll(Structure):
    _fields_ = [
        ("Time", c_char_p),
        ("EventID", c_char_p),
        ("Keyword", c_char_p),
        ("Level", c_int),
        ("User", c_char_p)
    ]

Var = SecurityVarToCdll()
# 把str转成bytes后赋值给c_char_p字段
Var.Time = c_char_p(Time.encode('utf-8'))
# 更简洁的写法:直接赋值bytes,ctypes会自动转换为c_char_p类型
# Var.Time = Time.encode('utf-8')

额外实用提示

  • 如果你的C函数使用的是宽字符(wchar_t*),可以改用ctypes的c_wchar_p,这时候直接传Python字符串(str)就没问题,不用转bytes。
  • 要是之后C代码需要修改这个字符串指向的内容,建议用create_string_buffer创建可修改的字节缓冲区(因为bytes是不可变的),示例:
    from ctypes import create_string_buffer
    Var.Time = create_string_buffer(Time.encode('utf-8'))
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:46:57