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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 06:35:25