【问题标题】:Python ctypes.string_at , pointer is right, but result string not correctPython ctypes.string_at ,指针正确,但结果字符串不正确
【发布时间】:2013-10-31 05:22:57
【问题描述】:

我正在通过以下示例学习如何使用 ctypes,但出现了奇怪的问题..

c文件在这里:

typedef struct post {
    char *x;
    char *y;
    int x_z;
} post_t;


void
foo (post_t *o, char *src)
{
    int i=0;

    char *p = src;
    int len = strlen(src);

    for (; *p != '\0'; i++, p++) {
        if (*p == 'x') {
            o->x = p;
            o->x_z = len-i;
        }
    }
    o->y=src;
}

python 代码在这里(test.oy):

from ctypes import *

foolib = CDLL("./foolib.so")

class Post(Structure):
    _fields_ = (
        ("x", c_void_p),
        ("y", c_void_p),
        ("x_z", c_int),
    )

o = Post()

s = "iooxooiddfggggggggggggvd"

foolib.foo(byref(o), create_string_buffer(s))

print o.x_z

print string_at(o.x, o.x_z)
print string_at(o.y, len(s))

结构post 映射到python class。 C 文件将是一个动态库foolib.so:

gcc -fPIC -shared -o傻瓜.so傻瓜.c

但是,奇怪的是,当我运行python test.py 时,我得到了以下输出:

21
ooiddfggggggggggggvd
ooiddfggggggggggggvd

string_at(o.y, len(s)) 除外iooxooiddfggggggggggggvd

我的代码哪里出了问题?谢谢。

顺便说一下,为了快速测试,我把代码放在了要点上:https://gist.github.com/hit9/7244344

【问题讨论】:

    标签: python c ctypes


    【解决方案1】:

    create_string_buffer(s) 生成一个临时字符串,该字符串在函数调用后被垃圾回收。只需传递实际的字符串,因为您不修改它:

    s = "iooxooiddfggggggggggggvd"
    foolib.foo(byref(o), s)
    

    更改前的输出(第二个字符串中的垃圾表示访问垃圾收集的内存,因此行为未定义):

    21
    xooiddfggggggggggggvd
    ♀ oxooiddfggggggggggggvd
    

    更改后的输出:

    21
    xooiddfggggggggggggvd
    iooxooiddfggggggggggggvd
    

    【讨论】:

    • 是的,Python 吃掉了临时缓冲区。感谢您告诉我我不需要创建字符串缓冲区,只需传递原始字符串
    【解决方案2】:

    因为 Python GC 吃掉了 create_string_buffer(s),而 src

    改成这样就OK了:

    buf = create_string_buffer(s)
    foolib.foo(byref(o), buf)
    

    【讨论】:

      【解决方案3】:

      也许你应该使用 c_char_p 而不是 c_void_p。

      【讨论】:

        猜你喜欢
        • 2021-04-03
        • 1970-01-01
        • 2017-11-28
        • 1970-01-01
        • 1970-01-01
        • 2021-10-07
        • 2016-12-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多