<div class="gmail_quote"><div class="gmail_quote"><div class="im">On Wed, Mar 9, 2011 at 6:36 PM, Christopher Cramer <span dir="ltr">&lt;<a href="mailto:tsuyoshi@yumegakanau.org" target="_blank">tsuyoshi@yumegakanau.org</a>&gt;</span> wrote:<br>
</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div class="im">
I need to call some C functions with a pointer to the middle of an array.<br>
The way I have been doing this is to create a function in ML, and export<br>
it, so that I can convert the array to a pointer and then add the offset.<br>
<br></div>
Is this safe?</blockquote><div><br>No.<br><br></div></div>The moment you call ML from C any pointers into the heap you previously held become invalid. You calling back into MLton via FFI is just a *really short* path through C. ;)<br>

<br>You cannot assume that the parameter pointer given to gzreadoffset is valid. The garbage collector might move it at any time.<br><br>A good way to achieve what you&#39;d like to do is make the gzreadoffset as a small piece of C code:<br>

<br>int gzreadoffset(gzFile *f,  unsigned char* buf, int offset, int len) {<br>  gzread(f, buf+offset, len);<br>  // buf is still valid because we haven&#39;t called out to SML<br>}<br><br>
</div><br>