【编程技术-请注意python指针的浅拷贝】此文章归类为:编程技术。
在写代码时发现了一个现象,请先看以下代码。这段代码是py3dbg的遍历模块的原始代码。代码很好理解,就不多赘述了。
在此基础上,简单修改以下代码。在append列表之前,我们把模块名称、module.modBaseAddr对象、模块基址打印出来。随后在循环遍历结束后将列表内的数据打印出来,使用aaaaa和bbbbb来区分打印结果。
这是append之前打印的结果。
这是列表内的数据。
我们可以发现一个问题,两次打印的模块基址是不同的。并且第二次打印出来的模块基址都是同一个值。
在探明原因之前,我们先看一下MODULEENTRY32的结构。其中要注意的是,modBaseAddr是一个指针。
再次回顾一下两次的打印结果。我们可以看到在append之前和之后,module.modBaseAddr对象所保存的地址是一致的。也就是说第二次打印的基址出现变化,是因为python只进行指针的浅拷贝。
我们通过一个更直观的代码来说名。
我们创建了一个整数变量 `a`,并将其引用赋值给了变量 `b`。然后,我们修改了 `b` 的值,实际上也修改了 `a` 的值。这是因为 `a` 和 `b` 引用的是同一个 `ctypes.c_int` 对象。
回到最开始那个代码中,我们append的只是module.modBaseAdd的地址,而在每次循环执行Module32Next函数时,会将指针指向的内容进行修改。所以在涉及到指针编程的时候,一定要注意浅拷贝的问题,
更多【编程技术-请注意python指针的浅拷贝】相关视频教程:www.yxfzedu.com