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
相关产品推荐
相关产品推荐

