<html><body bgcolor="#FFFFFF"><div>I confess I don't know a lot about C so I may be off base here... But it looks like your c func extendarray returns a pointer to the new extended array, but you are not capturing this pointer in your python when you call the c func. So the python code is pointing at the old deallocated array.</div><div><br></div><div>Does that make sense and/or point you in the right direction?<br><br>-----------------------------<div>Sent from a mobile device with a bad e-mail client.</div><div>-----------------------------</div></div><div><br>On Dec 13, 2010, at 10:27 AM, Sachin Kamboj <<a href="mailto:backslash42@gmail.com">backslash42@gmail.com</a>> wrote:<br><br></div><div></div><blockquote type="cite"><div>
                <div>Hi All,</div><div><br></div><div>I was trying to use the ctypes module for a project. I was creating a dynamically allocated array of "max_entries" pairs and once the array was exhausted, I was creating a new array of size (1.5 * max_entries) and copying the contents from the old array to the new array. </div><div><br></div><div>Unfortunately, when I try to access the contents of this new_array, I get a "NULL pointer access" exception. The corresponding C code seems to work perfectly. (See code below.)</div><div><br></div><div>I was wondering if I was missing something about the way the ctypes module works. Any help would be greatly appreciated. (Not sure if this is the appropriate mailing list for my question.)</div><div><br></div><div>/Thanks!</div><div><br></div><div>---</div><div><br></div><div><font class="Apple-style-span" face="'Courier New'">#!/usr/bin/env python</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">from ctypes import *</font></div><div><font class="Apple-style-span" face="'Courier New'">import math</font></div><div><font class="Apple-style-span" face="'Courier New'">import random</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">class PAIR(Structure):</font></div><div><font class="Apple-style-span" face="'Courier New'"> _fields_ = [("a", c_long),</font></div><div><font class="Apple-style-span" face="'Courier New'"> ("b", c_long)]</font></div><div><font class="Apple-style-span" face="'Courier New'"> </font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">class MY_ARR(Structure):</font></div><div><font class="Apple-style-span" face="'Courier New'"> _fields_ = [("no_entries", c_longlong),</font></div><div><font class="Apple-style-span" face="'Courier New'"> ("max_entries", c_longlong),</font></div><div><font class="Apple-style-span" face="'Courier New'"> ("entries", POINTER(POINTER(PAIR)))</font></div><div><font class="Apple-style-span" face="'Courier New'"> ]</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">def extendArray(x):</font></div><div><font class="Apple-style-span" face="'Courier New'"> print "Extending Array"</font></div><div><font class="Apple-style-span" face="'Courier New'"> print "Before: %d/%d" % (<a href="http://x.no">x.no</a>_entries, x.max_entries)</font></div><div><font class="Apple-style-span" face="'Courier New'"> old_arr = x.entries</font></div><div><font class="Apple-style-span" face="'Courier New'"> </font></div><div><font class="Apple-style-span" face="'Courier New'"> # Create a new array</font></div><div><font class="Apple-style-span" face="'Courier New'"> new_max_entries = int(math.ceil(1.5 * x.max_entries))</font></div><div><font class="Apple-style-span" face="'Courier New'"> x.entries = (POINTER(PAIR) * new_max_entries)()</font></div><div><font class="Apple-style-span" face="'Courier New'"> </font></div><div><font class="Apple-style-span" face="'Courier New'"> # Copy the entries from the old array to the new array</font></div><div><font class="Apple-style-span" face="'Courier New'"> for i in range(<a href="http://x.no">x.no</a>_entries):</font></div><div><font class="Apple-style-span" face="'Courier New'"> x.entries[i] = old_arr[i]</font></div><div><font class="Apple-style-span" face="'Courier New'"> </font></div><div><font class="Apple-style-span" face="'Courier New'"> x.max_entries = new_max_entries</font></div><div><font class="Apple-style-span" face="'Courier New'"> print "After: %d/%d" % (<a href="http://x.no">x.no</a>_entries, x.max_entries)</font></div><div><font class="Apple-style-span" face="'Courier New'"> return x</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">def printPair(x):</font></div><div><font class="Apple-style-span" face="'Courier New'"> print x.contents.a, x.contents.b</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">def printArray(x):</font></div><div><font class="Apple-style-span" face="'Courier New'"> print "Printing %d/%d Entries" % (<a href="http://x.no">x.no</a>_entries, x.max_entries)</font></div><div><font class="Apple-style-span" face="'Courier New'"> for i in range(<a href="http://x.no">x.no</a>_entries):</font></div><div><font class="Apple-style-span" face="'Courier New'"> printPair(x.entries[i])</font></div><div><font class="Apple-style-span" face="'Courier New'"> </font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">if __name__ == "__main__":</font></div><div><font class="Apple-style-span" face="'Courier New'"> x = MY_ARR(0, 10, (POINTER(PAIR) * 10)())</font></div><div><font class="Apple-style-span" face="'Courier New'"> for i in range(100):</font></div><div><font class="Apple-style-span" face="'Courier New'"> if <a href="http://x.no">x.no</a>_entries == x.max_entries:</font></div><div><font class="Apple-style-span" face="'Courier New'"> print "\n\nPrinting Before Extension"</font></div><div><font class="Apple-style-span" face="'Courier New'"> printArray(x)</font></div><div><font class="Apple-style-span" face="'Courier New'"> </font></div><div><font class="Apple-style-span" face="'Courier New'"> extendArray(x)</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'"> print "\n\nPrinting After Extension"</font></div><div><font class="Apple-style-span" face="'Courier New'"> printArray(x)</font></div><div><font class="Apple-style-span" face="'Courier New'"> </font></div><div><font class="Apple-style-span" face="'Courier New'"> my_pair = PAIR(i, random.randint(0, 100))</font></div><div><font class="Apple-style-span" face="'Courier New'"> x.entries[x.no_entries] = pointer(my_pair)</font></div><div><font class="Apple-style-span" face="'Courier New'"> <a href="http://x.no">x.no</a>_entries += 1</font></div><div><font class="Apple-style-span" face="'Courier New'"> </font></div><div><font class="Apple-style-span" face="'Courier New'"> printPair(x.entries[i])</font></div><div><font class="Apple-style-span" face="'Courier New'"> </font></div><div><font class="Apple-style-span" face="'Courier New'"> printArray(x)</font></div><div><br></div><div>---</div><div>Now unfortunately, when I try to run this code, I am getting a "NULL pointer access" exception:</div><div><br></div><div>$ python TestExtension.py </div><div>0 40</div><div>1 40</div><div>2 11</div><div>3 36</div><div>4 82</div><div>5 73</div><div>6 93</div><div>7 100</div><div>8 75</div><div>9 80</div><div><br></div><div><br></div><div>Printing Before Extension</div><div>Printing 10/10 Entries</div><div>0 40</div><div>1 40</div><div>2 11</div><div>3 36</div><div>4 82</div><div>5 73</div><div>6 93</div><div>7 100</div><div>8 75</div><div>9 80</div><div>Extending Array</div><div>Before: 10/10</div><div>After: 10/15</div><div><br></div><div><br></div><div>Printing After Extension</div><div>Printing 10/15 Entries</div><div>Traceback (most recent call last):</div><div> File "TestExtension.py", line 55, in <module></div><div> printArray(x)</div><div> File "TestExtension.py", line 42, in printArray</div><div> printPair(x.entries[i])</div><div> File "TestExtension.py", line 37, in printPair</div><div> print x.contents.a, x.contents.b</div><div>ValueError: NULL pointer access</div><div><br></div><div>---</div><div><br></div><div>The corresponding C code works perfectly:</div><div><br></div><div><font class="Apple-style-span" face="'Courier New'">#include <stdio.h></font></div><div><font class="Apple-style-span" face="'Courier New'">#include <stdlib.h></font></div><div><font class="Apple-style-span" face="'Courier New'">#include <math.h></font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">typedef struct {</font></div><div><font class="Apple-style-span" face="'Courier New'"> long a;</font></div><div><font class="Apple-style-span" face="'Courier New'"> long b;</font></div><div><font class="Apple-style-span" face="'Courier New'">} pair;</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">typedef struct {</font></div><div><font class="Apple-style-span" face="'Courier New'"> long long no_entries;</font></div><div><font class="Apple-style-span" face="'Courier New'"> long long max_entries;</font></div><div><font class="Apple-style-span" face="'Courier New'"> pair **entries;</font></div><div><font class="Apple-style-span" face="'Courier New'">} my_arr;</font></div><div><font class="Apple-style-span" face="'Courier New'"> </font></div><div><font class="Apple-style-span" face="'Courier New'">my_arr *extend_array(my_arr *x) {</font></div><div><font class="Apple-style-span" face="'Courier New'"> int i;</font></div><div><font class="Apple-style-span" face="'Courier New'"> pair **old_entries = x->entries;</font></div><div><font class="Apple-style-span" face="'Courier New'"> long long new_max_entries = ceil(1.5 * x->max_entries);</font></div><div><font class="Apple-style-span" face="'Courier New'"> </font></div><div><font class="Apple-style-span" face="'Courier New'"> printf("Extending Array\n");</font></div><div><font class="Apple-style-span" face="'Courier New'"> printf("Before: %lld/%lld\n", x->no_entries, x->max_entries);</font></div><div><font class="Apple-style-span" face="'Courier New'"> </font></div><div><font class="Apple-style-span" face="'Courier New'"> x->entries = malloc(sizeof(pair *) * new_max_entries);</font></div><div><font class="Apple-style-span" face="'Courier New'"> for (i = 0; i < 100; ++i) {</font></div><div><font class="Apple-style-span" face="'Courier New'"> x->entries[i] = old_entries[i];</font></div><div><font class="Apple-style-span" face="'Courier New'"> }</font></div><div><font class="Apple-style-span" face="'Courier New'"> x->max_entries = new_max_entries;</font></div><div><font class="Apple-style-span" face="'Courier New'"> free(old_entries);</font></div><div><font class="Apple-style-span" face="'Courier New'"> </font></div><div><font class="Apple-style-span" face="'Courier New'"> printf("After: %lld/%lld\n", x->no_entries, x->max_entries);</font></div><div><font class="Apple-style-span" face="'Courier New'"> return x;</font></div><div><font class="Apple-style-span" face="'Courier New'">}</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">void print_pair(pair *p) {</font></div><div><font class="Apple-style-span" face="'Courier New'"> printf("%ld\t%ld\n", p->a, p->b);</font></div><div><font class="Apple-style-span" face="'Courier New'">}</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">void print_array(my_arr *x) {</font></div><div><font class="Apple-style-span" face="'Courier New'"> int i;</font></div><div><font class="Apple-style-span" face="'Courier New'"> printf("Printing %lld/%lld entries\n", x->no_entries, x->max_entries);</font></div><div><font class="Apple-style-span" face="'Courier New'"> for (i = 0; i < x->no_entries; ++i) {</font></div><div><font class="Apple-style-span" face="'Courier New'"> print_pair(x->entries[i]);</font></div><div><font class="Apple-style-span" face="'Courier New'"> }</font></div><div><font class="Apple-style-span" face="'Courier New'">}</font></div><div><font class="Apple-style-span" face="'Courier New'"><br></font></div><div><font class="Apple-style-span" face="'Courier New'">int main(int argc, char *argv[])</font></div><div><font class="Apple-style-span" face="'Courier New'">{</font></div><div><font class="Apple-style-span" face="'Courier New'"> int i;</font></div><div><font class="Apple-style-span" face="'Courier New'"> my_arr x = {</font></div><div><font class="Apple-style-span" face="'Courier New'"> 0, </font></div><div><font class="Apple-style-span" face="'Courier New'"> 10,</font></div><div><font class="Apple-style-span" face="'Courier New'"> malloc(sizeof(pair *) * 10)</font></div><div><font class="Apple-style-span" face="'Courier New'"> };</font></div><div><font class="Apple-style-span" face="'Courier New'"> </font></div><div><font class="Apple-style-span" face="'Courier New'"> for (i = 0; i < 100; ++i) {</font></div><div><font class="Apple-style-span" face="'Courier New'"> if (<a href="http://x.no">x.no</a>_entries == x.max_entries) {</font></div><div><font class="Apple-style-span" face="'Courier New'"> extend_array(&x);</font></div><div><font class="Apple-style-span" face="'Courier New'"> }</font></div><div><font class="Apple-style-span" face="'Courier New'"> pair *my_pair = malloc(sizeof(pair));</font></div><div><font class="Apple-style-span" face="'Courier New'"> my_pair->a = i;</font></div><div><font class="Apple-style-span" face="'Courier New'"> my_pair->b = rand() % 100;</font></div><div><font class="Apple-style-span" face="'Courier New'"> </font></div><div><font class="Apple-style-span" face="'Courier New'"> x.entries[x.no_entries++] = my_pair;</font></div><div><font class="Apple-style-span" face="'Courier New'"> print_pair(x.entries[i]);</font></div><div><font class="Apple-style-span" face="'Courier New'"> }</font></div><div><font class="Apple-style-span" face="'Courier New'"> print_array(&x);</font></div><div><font class="Apple-style-span" face="'Courier New'"> return 0;</font></div><div><font class="Apple-style-span" face="'Courier New'">}</font></div><div><span id="goog_345597049"></span><span id="goog_345597050"></span><br></div><div><br></div>
</div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>Tutor maillist - <a href="mailto:Tutor@python.org"><a href="mailto:Tutor@python.org">Tutor@python.org</a></a></span><br><span>To unsubscribe or change subscription options:</span><br><span><a href="http://mail.python.org/mailman/listinfo/tutor">http://mail.python.org/mailman/listinfo/tutor</a></span><br></div></blockquote></body></html>