gpt4 book ai didi

Python/Ctypes - 访问指针(数组)时出现段错误

转载 作者:行者123 更新时间:2023-11-30 14:49:05 24 4
gpt4 key购买 nike

This is similar except I do not get a single value and instead segfault on [0] or .contents

如何从 Python 访问“数组”中的元素?

在 C 中我有类似的东西

#pragma pack(push, 1)
struct Data {
int i;
int *array;
};
#pragma pack(pop)

typedef struct {
bool (* const get) (struct Data*, const char *source);
void (* const print) (struct Data*);
} DataFn;
extern DataFn const DATAFUNC;

在Python中我有类似的东西

class Data(ctypes.Structure):
_fields_ = [
("i", ctypes.c_int),
("array", ctypes.POINTER(ctypes.c_int))
]

class DATA_FN(ctypes.Structure):
_fields_ = [
("get" , ctypes.CFUNCTYPE(
ctypes.c_bool,
ctypes.POINTER(Data),
ctypes.c_char_p)),
("print" , ctypes.CFUNCTYPE(None,
ctypes.POINTER(Data)))
]

从Python我可以做类似的事情..

    with open("xx0c.exx", "rb") as f:
fdata = f.read()
dfn.get(ctypes.byref(data),f fdata)
dfn.print(ctypes.byref(data))
print(data)
print(data.i) #7, correct
#print(data.array.contents) #segfault
#print(data.array) #segfault
ptr = ctypes.pointer(data)
print(ptr.contents.array[0]) #segfault

从 python 调用的 C 函数将打印 .. 这是正确的

i = 7

array = 0x6ffff360034

array 0 = 20

array 1 = 27a40

array 2 = 127e20

array 3 = 128ae0

array 4 = 47e850

array 5 = 57ec30

array 6 = 580230

我可以看到 python 中的数组与 C 中的数组并不接近。

按照要求提供示例 C 代码。这些是静态的,但可以通过 DATAFUNC 访问它们。使用这些的 C 程序都很好。

static bool getdata(struct Data *d, const char *filedata) {
bool good = false;
if (d != NULL && filedata != NULL) {
d -> i = (int32_t)filedata[0];
d -> array = (uint32_t*)(filedata + sizeof(int32_t));
if ( d->i > 0 ) {
good = true;
}
}
return good;
}

static void printdata(struct Data *d) {
if (d == NULL) {
return;
}
printf("i = %i\n", d -> i);
printf("array = %p\n", d -> array);
unsigned int i;
for (i = 0; i < d -> i; i++) {
printf("array %i = %x\n", i, d -> array[i]);
}
}

最佳答案

我通过将 pack 添加到 python 结构中解决了该问题,如下所示。

class Data(ctypes.Structure):
_pack_ = 1
_fields_ = [
("i", ctypes.c_int),
("array", ctypes.POINTER(ctypes.c_int))
]

这修复了所有问题,并在添加循环来迭代数组后给出 .. 的输出。

number of offsets = 7
offsets = 0x6ffff360034
offset 0 = 20
offset 1 = 27a40
offset 2 = 127e20
offset 3 = 128ae0
offset 4 = 47e850
offset 5 = 57ec30
offset 6 = 580230
<__main__.Data object at 0x6ffffd5f400>
7
<__main__.LP_c_int object at 0x6ffffd5f488>
0x20
0x27a40
0x127e20
0x128ae0
0x47e850
0x57ec30
0x580230

关于Python/Ctypes - 访问指针(数组)时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50002896/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com