Python ctypes设置c_char_p基础值

Python ctypes设置c_char_p基础值,python,ctypes,Python,Ctypes,我有一个指向结构的指针。在该结构中,其中一个字段是指针(c\u char)。我正在尝试设置基础值,以便在任何其他具有指向相同地址的指针的应用程序中反映更改 class foo(Structure): _fields_ = [("bar", POINTER(c_char)), ("bazaz" c_int), ...morefields] z = .... # z is a pointer to a foo # leg

我有一个指向结构的指针。在该结构中,其中一个字段是
指针(c\u char)
。我正在尝试设置基础值,以便在任何其他具有指向相同地址的指针的应用程序中反映更改

class foo(Structure):
    _fields_ = [("bar", POINTER(c_char)),
                 ("bazaz" c_int),
                 ...morefields]

z = .... # z is a pointer to a foo

# legal but doesn't do what I expect, this seems to set the pointer itself, not the underlying contents
z.contents.bar = b"asdfasdf" 
这显示“仅在python端”。但是,查看
bar
的C进程没有得到反映的更改


如何“管理”
bar
,以便我可以设置它,并且该更改会反映在任何其他具有指向相同地址指针的应用程序中?

您需要使用
创建字符串缓冲区
,如文档中所述:

但是,您应该小心,不要将它们传递给期望指向可变内存的指针的函数。如果您需要可变内存块,ctypes有一个create_string_buffer()函数,它以各种方式创建这些内存块

因此,在您的情况下,您希望执行以下操作:

z.contents.bar=创建字符串缓冲区(b“我的字符串”,10)

这将
指向新的缓冲区,然后您应该可以通过
更改内容。
对于Unicode(
c\u wchar
),使用
create\u Unicode\u buffer
从注释中,您有一个返回
指针(foo)
实例的函数。下面是一个读取并更改返回值的工作示例。如果您的代码仍然不起作用,请创建一个类似的示例来再现该问题:

test.c

#include <stdlib.h>
#include <string.h>

struct foo
{
    char* bar;
};

__declspec(dllexport) struct foo* func()
{
    /* This leaks memory, but is just an example... */
    struct foo* f = malloc(sizeof(struct foo));
    f->bar = malloc(20);
    strcpy(f->bar,"abcdefghijklmnop");
    return f;
}
输出:

b'abcdefghijklmnop'
b'abcd'

z本身是指向更大结构的指针。我该如何用酒吧来做这件事?我对我的问题进行了编辑,以便更清楚地表明,bar并不是唯一的字段。你在设定zwrong@Tommy我已经更新了我的答案。如果你仍然有问题,你能分享一个小的、独立的、可复制的例子吗?这个建议引发了
TypeError:不兼容的类型,c_char\u Array\u 10实例而不是c_char\u p实例
。看起来
create\u string\u buffer
没有返回
c\u char\u p
的确切类型。我没有一个小的可复制的例子,因为我没有C的经验如果你运行
打印(键入(创建字符串缓冲区(b“My string”,10))
它显示
,看起来像是其他人问过这个问题:z是一个指向另一个C函数返回的foo的指针(
z=f()
f
restype
指针(foo)
。因此Z是
指针(foo)
但我没有明确的这一行。访问
z
其他非指针的方法似乎很好。底层C函数不需要写入
bar
,但它本质上是一个共享缓冲区,我需要能够从python端设置它。如果
z
类型是
指针(foo)
那么
z.contents.bar=b'abcd'
就可以了。用
print(type(z))
print(type(z.contents.bar))的结果更新你的问题
。我将使用您描述中的工作演示更新我的答案。感谢您的回答。我可以用python重现您的代码,但是,此条形字段由c进程读取(它是共享内存缓冲区),在C端,缓冲区不保存python中设置的更新值。具体来说,这似乎是将f.contents.bar设置为指向字符串b'abcd',而不是将字符串'abcd'复制到f.contents.bar所指向的缓冲区中。也许我需要
memmove
b'abcdefghijklmnop'
b'abcd'