簡體   English   中英

ctypes將指針傳遞給結構中的字段

[英]ctypes passing a pointer to a field in a struct

我需要在Python中構造以下數據類型以傳遞給C函數:

struct {
  unsigned a,b,c;
  char data[8];
};

但是,我需要實際將指向數據字段的指針傳遞給函數,而不是指向結構的指針,我無法弄清楚如何執行此操作。

這是我到目前為止:

from ctypes import *                                                           
class MyStruct(Structure):                                              
  _fields_ = [("a",c_uint), ("b",c_uint), ("c",c_uint), ("data",c_char*8)]
mystruct = MyStruct(0,1,8,"ABCDEFGH")
external_c_function(mystruct.data)

現在在CI中有這個功能:

int external_c_function(char *data) {
  int a = ((unsigned *)data)[-1];
  int b = ((unsigned *)data)[-2];
  int c = ((unsigned *)data)[-3];
  ...
}

問題是,當函數被調用時,“data”正確地指向“ABCDEFGH”,但是當我嘗試獲取其前面的其余struct數據時,它就是垃圾。 我究竟做錯了什么? mystruct不是像真正的C結構那樣在內存中按順序存在嗎? 我懷疑陣列發生了一些有趣的事情:我實際上是在做這樣傻事嗎?

struct {
  unsigned a,b,c;
  char *data; // -> char[8]
};

如果是這樣,我該怎么做呢?

您可以使用元素的偏移量通過引用將指針傳遞給結構的元素:

external_c_function(byref(mystruct,MyStruct.data.offset))

看來,當您引用mystruct.data ,會生成一份數據副本。 我這樣說是因為python命令type(mystruct.data)返回str而不是C類型。

我假設您無法修改external_c_function以接受結構開頭的指針,因為這將是最明顯的解決方案。 因此,您需要以某種方式在python中執行C樣式指針算法 - 即獲取mystruct的地址(可能使用ctypes.pointer ),然后找出一種方法來將此指針遞增適當的字節數。

我不知道你如何在python中做這樣的指針算法,或者甚至可以以任何健壯的方式做。 但是,您始終可以將external_c_function包裝在另一個執行必要指針算術的C函數中。

編輯

馬克的答案整齊地解決了這個問題。 我對錯誤發生原因的評論仍然是正確的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM