首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在64位环境下处理ctype中的字符串数组(char **)?

如何在64位环境下处理ctype中的字符串数组(char **)?
EN

Stack Overflow用户
提问于 2011-02-24 03:23:31
回答 2查看 1.8K关注 0票数 1

我在Python语言中使用ctype来处理libgphoto2。以下代码在32位计算机上成功,但在64位计算机(Linux、Ubuntu)上失败,并出现分段错误:

代码语言:javascript
复制
import ctypes

gp = ctypes.CDLL('libgphoto2.so')
a = gp.gp_library_version(0)
x = ctypes.c_char_p.from_address(a)
x.value

libphoto2、ctype和python都来自存储库,所以我假设问题出在我的代码中;我需要以一种更通用的方式来考虑指针。gp_library_version()返回const char **,这是一个字符串常数数组。其他gp_*函数工作正常。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-24 03:38:44

问题是,在默认情况下,ctype假设所有函数都返回32位的int。但是,在64位系统上,指针是64位的,所以您从指针返回值中删除了高32位,因此当您尝试取消引用该无效指针时,您会得到一个段错误。

您可以通过将类型分配给函数的restype属性来更改函数的预期返回类型,如下所示:

代码语言:javascript
复制
gp = ctypes.CDLL('libgphoto2.so')
gp.gp_library_version.restype = ctypes.POINTER(ctypes.c_char_p)
a = gp.gp_library_version(0)
print a[0].value
票数 3
EN

Stack Overflow用户

发布于 2011-02-24 03:36:39

如果您没有对ctype中的函数进行任何注释,则假定它们返回32位整数。在32位进程中,这些整数和指针大多是可互换的-对于64位构建则不是这样。

只是在做

代码语言:javascript
复制
gp.gp_library_version.restype = ctypes.c_void_p

在这种情况下,您的调用应该足够了(您仍然需要x = ctypes.c_char_p.from_address(a)行)。

检查API文档,看看你是否应该在使用这个指针后自己释放它(在这种情况下可能是)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5095944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档