在Python中使用posix_memalign

0 投票
1 回答
728 浏览
提问于 2025-04-15 18:26

我搞不清楚为什么下面的代码不管用

import ctypes
from ctypes.util import find_library
libc = ctypes.CDLL(find_library('c'))

userpointer = ctypes.c_void_p
sizeimage = 320*240*2

if libc.posix_memalign(userpointer, libc.getpagesize(), sizeimage) != 0:
    raise Exception('ENOMEM')

我正在尝试用v4l2来捕获视频,但我无法分配内存。 我试着用ctypes.addressof(userpointer)来传递地址。 我也试着把userpointer转换成c_void_p, 但是还是没有效果。

1 个回答

1

你的代码有两个问题:你把userpointer设置成了ctypes.c_void_p的类型,而不是它的一个实例;另外,你直接把userpointer这个void*传给了posix_memalign,但posix_memalign其实需要的是void**类型。下面的代码可以实现你想要的效果:

import ctypes
from ctypes.util import find_library
libc = ctypes.CDLL(find_library('c'))

userpointer = ctypes.c_void_p()
sizeimage = 320*240*2

if libc.posix_memalign(ctypes.byref(userpointer), libc.getpagesize(),
                       sizeimage) != 0:
    raise Exception('ENOMEM')

撰写回答