# Using ccall with pointers in signature

**URL:** <https://discourse.julialang.org/t/using-ccall-with-pointers-in-signature/90124>\
**Category:** General Usage\
**Tags:** ccall\
**Created:** [November 11, 2022, 3:24pm UTC](https://discourse.julialang.org/t/using-ccall-with-pointers-in-signature/90124 "2022-11-11T15:24:10Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![nvenkov1](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nvenkov1/32/43679_2.png) [@nvenkov1](https://discourse.julialang.org/u/nvenkov1)\
**Post date:** [November 11, 2022, 3:24pm UTC](https://discourse.julialang.org/t/using-ccall-with-pointers-in-signature/90124/1 "2022-11-11T15:24:10Z")

</div>

I have a C function with signature `double *fwht(double *a, int n)`. I have compiled the function as part of a shared library and I try to call it with ccall from Julia with

```julia
ccall((:fwht, "./libmean.so"), Vector{Float64}, (Vector{Float64}, Int), rand(10_000), 10_000)

```

However, I get a segmentation fault. I think this is because of the incorrect way I specify types in the ccall function. Could someone tell me how I should define the types in ccall for the signature I have of fwht?

---

<div class="post-metadata">

**Author:** ![GunnarFarneback](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gunnarfarneback/32/1827_2.png) [@GunnarFarneback](https://discourse.julialang.org/u/GunnarFarneback)\
**Post date:** [November 11, 2022, 3:48pm UTC](https://discourse.julialang.org/t/using-ccall-with-pointers-in-signature/90124/2 "2022-11-11T15:48:50Z")

</div>

Try

```julia
ccall((:fwht, "./libmean.so"), Ptr{Cdouble}, (Ptr{Cdouble}, Cint), rand(10_000), 10_000)

```

---

<div class="post-metadata">

**Author:** ![nvenkov1](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nvenkov1/32/43679_2.png) [@nvenkov1](https://discourse.julialang.org/u/nvenkov1)\
**Post date:** [November 11, 2022, 4:07pm UTC](https://discourse.julialang.org/t/using-ccall-with-pointers-in-signature/90124/3 "2022-11-11T16:07:07Z")

</div>

It works. But the return type is `Ptr{Float64}`. How do you recast it into a vector? Or maybe I should say how do you dereference it?

---

<div class="post-metadata">

**Author:** ![GunnarFarneback](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/gunnarfarneback/32/1827_2.png) [@GunnarFarneback](https://discourse.julialang.org/u/GunnarFarneback)\
**Post date:** [November 11, 2022, 4:10pm UTC](https://discourse.julialang.org/t/using-ccall-with-pointers-in-signature/90124/4 "2022-11-11T16:10:36Z")

</div>

You want to look into `unsafe_wrap` (and/or `unsafe_load`). Notice that the “unsafe” part of the name really means that. If you do something sufficiently bad, the program will crash like a C program does under similar circumstances.

---

<div class="post-metadata">

**Author:** ![nvenkov1](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/nvenkov1/32/43679_2.png) [@nvenkov1](https://discourse.julialang.org/u/nvenkov1)\
**Post date:** [November 11, 2022, 4:15pm UTC](https://discourse.julialang.org/t/using-ccall-with-pointers-in-signature/90124/5 "2022-11-11T16:15:39Z")

</div>

Okay. The following works:

```julia
z_ptr = ccall((:fwht, "./libmean.so"), Ptr{Cdouble}, (Ptr{Cdouble}, Cint), rand(10_000), 10_000)
z = unsafe_wrap(Vector{Float64}, z_ptr, 10_000)

```
