我试图在项目中使用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指针访问相关推荐

  1. 指针详解(包含指针,指针数组,数组指针,指向数组指针的指针,函数指针,函数指针数组,指向函数指针数组的指针)

    大家都知道,指针有双面性,灵活度高,但是运用时一定要避免野指针和空指针的出现.否则会出现一些意想不到的错误.话不多说,看下面的代码: int main() {int arr[10] = { 0 };/ ...

  2. 指针数组概念 和 函数指针数组实战 和指针函数的概念和实战

    1.指针数组概念 int (*p)[4]; 是一个数组指针 ,强调的是指针,这是指针指向的是某个数组 (*p)这个指针含有四个元素的一维数组 指针数组呢? 强调的是数组 我们可以定义一个数组,数组里面 ...

  3. 【C语言】函数指针数组和指向函数指针数组的指针

    一.函数指针数组 1.1函数指针数组的声明 函数指针数组的声明如下,所谓函数指针数组就是在之前的函数指针的基础上增加了[],由于[]的优先级高于*,故 pf先与[]结合,说明它是一个数组,再与*结合说 ...

  4. 指针数组,数组指针,存放数组指针的数组,指向存放数组指针数组的指针,函数指针,函数指针数组,指向函数指针数组的指针

    数组: 一组数据的集合称为数组,它所包含的每一个数据叫做数组元素,例如 int a[4]: 它定义了一个长度为4的整型数组,名字是a . 一般的定义数组可以用 :数据类型 数组名 [数组长度]:来声明 ...

  5. C语言指针的那些事:第三篇(函数指针,指针函数,函数指针数组,指向函数指针数组的指针)

    文章目录 1. 函数指针 1)函数指针的例题 2. 指针函数 3. 函数指针数组 1)函数指针数组的用途 4. 指向函数指针数组的指针 5. 一些后话 1. 函数指针 函数指针就是指向函数的指针:本质 ...

  6. 图解C语言中数组指针、指针数组、函数指针、函数指针数组、指向函数指针数组的指针

    关于C语言中数组指针.函数指针.指针数组.函数指针数组.指向函数指针数组的指针一直比较绕,稍微整理一下. 到底是指针还是数组? 其实到底是指针还是数组还是看变量名与[]先结合还是*先结合.我们知道C语 ...

  7. 使用Python中的tabula模块进行pdf2excel转化时出现JAVA_NOT_FOUND_ERROR问题

    使用Python中的tabula模块进行pdf2excel转化时出现JAVA_NOT_FOUND_ERROR问题 1.python中pdf2excel转化模块的选用 1.1 pdfminer 1.2 ...

  8. 系统检测到在一个调用中尝试使用指针参数时的无效指针地址

    环境 Win10(64).python38.uvicorn,可以正常启动,但接收post或get请求时报错. 报错如下 INFO:root:server started at http://127.0 ...

  9. python的ctypes模块详解数组_python ctypes结构数组

    代码中的STRUCT_ARRAY应该是指向指针数组的指针,而不是指向数组中元素的指针,因为您要将STRUCT_2指针附加到数组. 在c中,STRUCT_ARRAY可以定义为* STRUCT_2 [le ...

最新文章

  1. android StringBuilder的Capacity的使用
  2. SAP HANA Delivery Unit概念简述
  3. java登录界面命令_Java命令行界面(第25部分):JCommando
  4. 数组的合并和升序排列_leetcode 33 搜索旋转排序数组
  5. 服务器改用ssh文件登录
  6. log4j教程_Log4j教程
  7. python异步IO编程(一)
  8. 解决VIVADO ZYNQ编译提示PS引脚约束警告
  9. GLFWError #65542 Happen, WGL: The driver does not appear to support OpenGL的问题处理经历
  10. 系统版本android 9,安卓9.0系统
  11. float gpu 加速_(总结篇)使用 MATLAB GPU 加速计算|MATLAB 并行计算与分布式服务器|MATLAB技术论坛...
  12. ITSS服务项目经理
  13. c语言中chat的使用方法图解,Mechat
  14. 读《长安的荔枝》有感
  15. cobol .cpy文件_Visual COBOL R3:“使传统的COBOL能够部署在JVM或.NET上”。
  16. 3.Flink-On-Yarn开发使用\原理\Session会话模式\Per-Job模式
  17. 代号Pie!Android 9.0那些开发者必须知道的事
  18. 如何用html布天猫页面,天猫前端系列教材 (四十七)- 其他页面 - 登录页面
  19. 2021-5-8字符串作业
  20. 计算机怎么识别你写的代码?

热门文章

  1. 电子科大电气工程导师介绍绍_预告|卓越讲堂第二期——电气工程及其自动化专业介绍...
  2. 【数据结构与算法】之深入解析“组合总和III”的求解思路与算法示例
  3. Swift之深入解析如何自定义操作符
  4. Metal之MTLBuffer批量加载顶点数量较多的图形渲染
  5. 216. Combination Sum III 组合总和 III
  6. 彻底掌握动态规划,第一节
  7. 征战蓝桥 —— 2014年第五届 —— C/C++A组第3题——神奇算式
  8. 深度学习——02、深度学习入门——python实现RNN算法
  9. ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— Arduino相关设置
  10. python人工智能——机器学习——分类算法-k近邻算法