ctypes创建同字节串字符指针指向同内存,如何让其指向不同地址?
问题原因
Python 对内容完全相同的不可变字节串会做驻留优化,即复用同一块内存地址。你用b'.'*80创建的两个字节串实际是同一个对象,因此ct.c_char_p会让两个指针指向同一块内存,导致C函数修改时两个变量的输出始终一致。
优化解决方案
以下是几种可靠的实现方式:
首选:使用ctypes可修改数组
create_string_buffer会在堆上分配独立的内存块,完全避开Python的驻留机制,是最稳妥的方案:import ctypes as ct # 创建两个独立的80字节缓冲区,初始填充为'.' var1 = ct.create_string_buffer(b'.'*80) var2 = ct.create_string_buffer(b'.'*80) api = ct.CDLL('api.dll') api.function1(var1, var2) print(var1.value.decode(), var2.value.decode())手动复制字节串绕过驻留
通过切片或类型转换生成新的字节串对象,迫使Python分配新内存:import ctypes as ct var1 = ct.c_char_p(b'.'*80) # 切片操作生成新字节串,避免驻留复用 var2 = ct.c_char_p(b'.'*80[:]) api = ct.CDLL('api.dll') api.function1(var1, var2) print(var1.value.decode(), var2.value.decode())先分配不同初始值再统一
先给两个指针分配不同内容的字节串,再手动同步初始值,确保内存地址独立:import ctypes as ct var1 = ct.c_char_p(b'.'*80) var2 = ct.c_char_p(b'*'*80) # 用memmove同步两个缓冲区的初始内容 ct.memmove(var2, var1, 80) api = ct.CDLL('api.dll') api.function1(var1, var2) print(var1.value.decode(), var2.value.decode())
内容的提问来源于stack exchange,提问作者oakca
相关产品推荐
相关产品推荐

