当前位置: 首页 > 面试题库 >

如何从python ctypes取消引用内存位置?

李耀
2023-03-14
问题内容

我想在python ctypes中复制以下c代码:

main() {
  long *ptr = (long *)0x7fff96000000;
  printf("%lx",*ptr);
}

我可以弄清楚如何以函数指针的形式调用此内存位置,而不仅仅是正常的取消引用:

from ctypes import *
"""
>>> fptr = CFUNCTYPE(None, None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/ctypes/__init__.py", line 104, in CFUNCTYPE
    class CFunctionType(_CFuncPtr):
TypeError: Error when calling the metaclass bases
    item 1 in _argtypes_ has no from_param method
"""
fptr = CFUNCTYPE(None, c_void_p) #add c_void_p since you have to have an arg
fptr2 = fptr(0x7fff96000000)
fptr2(c_void_p(0))
#python: segfault at 7fff96000000 ip 00007fff96000000

由于存在段错误,指令指针指向该存储位置,因此它已成功调用它。但是我不能只读取内存位置:

ptr = POINTER(c_long)
ptr2 = ptr(c_long(0x7fff96000000))
#>>> ptr2[0]
#140735709970432
#>>> hex(ptr2[0])
#'0x7fff96000000'
#>>> ptr2.contents
#c_long(140735709970432)

问题答案:

ctypes.cast

>>> import ctypes
>>> c_long_p = ctypes.POINTER(ctypes.c_long)
>>> some_long = ctypes.c_long(42)
>>> ctypes.addressof(some_long)
4300833936
>>> ctypes.cast(4300833936, c_long_p)
<__main__.LP_c_long object at 0x1005983b0>
>>> ctypes.cast(4300833936, c_long_p).contents
c_long(42)


 类似资料:
  • 问题内容: 我是GoLang的新手,来自Delphi C ++世界-诚然对这种语言感到非常兴奋,我认为它将成为“下一件大事”。 我正在尝试了解Go解析器和编译器如何处理指针和引用-似乎找不到任何放置一些明确规则的地方。 例如,在下面的代码示例中,返回类型和局部变量是指针类型,并且在其声明中需要使用指针符号,但是在使用时不必取消引用它们:。但是在同一代码中,输入参数被声明为指针,并且必须被取消引用才

  • 我是gccgo新手,我需要编译/运行以下代码的帮助(这在“标准”go编译器中可以正常工作(抱歉,我不知道正确的名称)): 我的gcc: 我的第一个文件: 我的第二个文件: 我的编译错误: 我做错了什么?

  • 我收到一个无效内存地址的运行时错误。 channel.go看起来像这样: 第36行怎么可能导致这种情况?m是否有可能为零?如果是,如何? 注意:哈希定义为字符串

  • 问题内容: 如何从Uri获取Bitmap对象(如果我成功将其存储在 以在应用程序中使用它? 有谁知道如何实现这一目标? 问题答案: 这是正确的方法: 如果您需要加载非常大的图像,则以下代码会将其加载到图块中(避免大内存分配):

  • 谁能指导我怎么做这件事吗? 我是一个新的android所以请,如果我能有一个详细的程序,我会很感激。