python 空指针_Python ctypes模块:扩展指针数组时进行NULL指针访问
我试图在项目中使用ctypes模块.我正在创建一个动态分配的“ max_entries”对数组,一旦该数组用完,我将创建一个新的大小为(1.5 * max_entries)的数组,并将内容从旧数组复制到新数组.
不幸的是,当我尝试访问此new_array的内容时,出现了“空指针访问”异常.相应的C代码似乎可以正常工作. (请参见下面的代码.)
我想知道我是否缺少有关ctypes模块工作方式的信息.任何帮助将不胜感激. (不确定这是否是适合我的问题的邮件列表.)
/谢谢!
#!/usr/bin/env python
from ctypes import *
import math
import random
class PAIR(Structure):
_fields_ = [("a", c_long),
("b", c_long)]
class MY_ARR(Structure):
_fields_ = [("no_entries", c_longlong),
("max_entries", c_longlong),
("entries", POINTER(POINTER(PAIR)))
]
def extendArray(x):
print "Extending Array"
print "Before: %d/%d" % (x.no_entries, x.max_entries)
old_arr = x.entries
# Create a new array
new_max_entries = int(math.ceil(1.5 * x.max_entries))
x.entries = (POINTER(PAIR) * new_max_entries)()
# Copy the entries from the old array to the new array
for i in range(x.no_entries):
x.entries[i] = old_arr[i]
x.max_entries = new_max_entries
print "After: %d/%d" % (x.no_entries, x.max_entries)
return x
def printPair(x):
print x.contents.a, x.contents.b
def printArray(x):
print "Printing %d/%d Entries" % (x.no_entries, x.max_entries)
for i in range(x.no_entries):
printPair(x.entries[i])
if __name__ == "__main__":
x = MY_ARR(0, 10, (POINTER(PAIR) * 10)())
for i in range(100):
if x.no_entries == x.max_entries:
print "
Printing Before Extension"
printArray(x)
extendArray(x)
print "
Printing After Extension"
printArray(x)
my_pair = PAIR(i, random.randint(0, 100))
x.entries[x.no_entries] = pointer(my_pair)
x.no_entries += 1
printPair(x.entries[i])
printArray(x)
现在,不幸的是,当我尝试运行此代码时,出现“空指针访问”异常:
$python TestExtension.py
0 40
1 40
2 11
3 36
4 82
5 73
6 93
7 100
8 75
9 80
Printing Before Extension
Printing 10/10 Entries
0 40
1 40
2 11
3 36
4 82
5 73
6 93
7 100
8 75
9 80
Extending Array
Before: 10/10
After: 10/15
Printing After Extension
Printing 10/15 Entries
Traceback (most recent call last):
File "TestExtension.py", line 55, in
printArray(x)
File "TestExtension.py", line 42, in printArray
printPair(x.entries[i])
File "TestExtension.py", line 37, in printPair
print x.contents.a, x.contents.b
ValueError: NULL pointer access
相应的C代码可以完美地工作:
#include
#include
#include
typedef struct {
long a;
long b;
} pair;
typedef struct {
long long no_entries;
long long max_entries;
pair **entries;
} my_arr;
my_arr *extend_array(my_arr *x) {
int i;
pair **old_entries = x->entries;
long long new_max_entries = ceil(1.5 * x->max_entries);
printf("Extending Array
");
printf("Before: %lld/%lld
", x->no_entries, x->max_entries);
x->entries = malloc(sizeof(pair *) * new_max_entries);
for (i = 0; i < 100; ++i) {
x->entries[i] = old_entries[i];
}
x->max_entries = new_max_entries;
free(old_entries);
printf("After: %lld/%lld
", x->no_entries, x->max_entries);
return x;
}
void print_pair(pair *p) {
printf("%ld%ld
", p->a, p->b);
}
void print_array(my_arr *x) {
int i;
printf("Printing %lld/%lld entries
", x->no_entries, x->max_entries);
for (i = 0; i < x->no_entries; ++i) {
print_pair(x->entries[i]);
}
}
int main(int argc, char *argv[])
{
int i;
my_arr x = {
0,
10,
malloc(sizeof(pair *) * 10)
};
for (i = 0; i < 100; ++i) {
if (x.no_entries == x.max_entries) {
extend_array(&x);
}
pair *my_pair = malloc(sizeof(pair));
my_pair->a = i;
my_pair->b = rand() % 100;
x.entries[x.no_entries++] = my_pair;
print_pair(x.entries[i]);
}
print_array(&x);
return 0;
}
python 空指针_Python ctypes模块:扩展指针数组时进行NULL指针访问相关推荐
- 指针详解(包含指针,指针数组,数组指针,指向数组指针的指针,函数指针,函数指针数组,指向函数指针数组的指针)
大家都知道,指针有双面性,灵活度高,但是运用时一定要避免野指针和空指针的出现.否则会出现一些意想不到的错误.话不多说,看下面的代码: int main() {int arr[10] = { 0 };/ ...
- 指针数组概念 和 函数指针数组实战 和指针函数的概念和实战
1.指针数组概念 int (*p)[4]; 是一个数组指针 ,强调的是指针,这是指针指向的是某个数组 (*p)这个指针含有四个元素的一维数组 指针数组呢? 强调的是数组 我们可以定义一个数组,数组里面 ...
- 【C语言】函数指针数组和指向函数指针数组的指针
一.函数指针数组 1.1函数指针数组的声明 函数指针数组的声明如下,所谓函数指针数组就是在之前的函数指针的基础上增加了[],由于[]的优先级高于*,故 pf先与[]结合,说明它是一个数组,再与*结合说 ...
- 指针数组,数组指针,存放数组指针的数组,指向存放数组指针数组的指针,函数指针,函数指针数组,指向函数指针数组的指针
数组: 一组数据的集合称为数组,它所包含的每一个数据叫做数组元素,例如 int a[4]: 它定义了一个长度为4的整型数组,名字是a . 一般的定义数组可以用 :数据类型 数组名 [数组长度]:来声明 ...
- C语言指针的那些事:第三篇(函数指针,指针函数,函数指针数组,指向函数指针数组的指针)
文章目录 1. 函数指针 1)函数指针的例题 2. 指针函数 3. 函数指针数组 1)函数指针数组的用途 4. 指向函数指针数组的指针 5. 一些后话 1. 函数指针 函数指针就是指向函数的指针:本质 ...
- 图解C语言中数组指针、指针数组、函数指针、函数指针数组、指向函数指针数组的指针
关于C语言中数组指针.函数指针.指针数组.函数指针数组.指向函数指针数组的指针一直比较绕,稍微整理一下. 到底是指针还是数组? 其实到底是指针还是数组还是看变量名与[]先结合还是*先结合.我们知道C语 ...
- 使用Python中的tabula模块进行pdf2excel转化时出现JAVA_NOT_FOUND_ERROR问题
使用Python中的tabula模块进行pdf2excel转化时出现JAVA_NOT_FOUND_ERROR问题 1.python中pdf2excel转化模块的选用 1.1 pdfminer 1.2 ...
- 系统检测到在一个调用中尝试使用指针参数时的无效指针地址
环境 Win10(64).python38.uvicorn,可以正常启动,但接收post或get请求时报错. 报错如下 INFO:root:server started at http://127.0 ...
- python的ctypes模块详解数组_python ctypes结构数组
代码中的STRUCT_ARRAY应该是指向指针数组的指针,而不是指向数组中元素的指针,因为您要将STRUCT_2指针附加到数组. 在c中,STRUCT_ARRAY可以定义为* STRUCT_2 [le ...
最新文章
- android StringBuilder的Capacity的使用
- SAP HANA Delivery Unit概念简述
- java登录界面命令_Java命令行界面(第25部分):JCommando
- 数组的合并和升序排列_leetcode 33 搜索旋转排序数组
- 服务器改用ssh文件登录
- log4j教程_Log4j教程
- python异步IO编程(一)
- 解决VIVADO ZYNQ编译提示PS引脚约束警告
- GLFWError #65542 Happen, WGL: The driver does not appear to support OpenGL的问题处理经历
- 系统版本android 9,安卓9.0系统
- float gpu 加速_(总结篇)使用 MATLAB GPU 加速计算|MATLAB 并行计算与分布式服务器|MATLAB技术论坛...
- ITSS服务项目经理
- c语言中chat的使用方法图解,Mechat
- 读《长安的荔枝》有感
- cobol .cpy文件_Visual COBOL R3:“使传统的COBOL能够部署在JVM或.NET上”。
- 3.Flink-On-Yarn开发使用\原理\Session会话模式\Per-Job模式
- 代号Pie!Android 9.0那些开发者必须知道的事
- 如何用html布天猫页面,天猫前端系列教材 (四十七)- 其他页面 - 登录页面
- 2021-5-8字符串作业
- 计算机怎么识别你写的代码?
热门文章
- 电子科大电气工程导师介绍绍_预告|卓越讲堂第二期——电气工程及其自动化专业介绍...
- 【数据结构与算法】之深入解析“组合总和III”的求解思路与算法示例
- Swift之深入解析如何自定义操作符
- Metal之MTLBuffer批量加载顶点数量较多的图形渲染
- 216. Combination Sum III 组合总和 III
- 彻底掌握动态规划,第一节
- 征战蓝桥 —— 2014年第五届 —— C/C++A组第3题——神奇算式
- 深度学习——02、深度学习入门——python实现RNN算法
- ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— Arduino相关设置
- python人工智能——机器学习——分类算法-k近邻算法