# Is Julia REPL supposed to choke on this?

**URL:** <https://discourse.julialang.org/t/is-julia-repl-supposed-to-choke-on-this/42089>\
**Category:** General Usage\
**Created:** [June 26, 2020, 4:45am UTC](https://discourse.julialang.org/t/is-julia-repl-supposed-to-choke-on-this/42089 "2020-06-26T04:45:28Z")\
**Posts on this page:** 14\
**Page:** 1

<div class="post-metadata">

**Author:** ![pauljurczak](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pauljurczak/32/921_2.png) [@pauljurczak](https://discourse.julialang.org/u/pauljurczak)\
**Post date:** [June 26, 2020, 4:45am UTC](https://discourse.julialang.org/t/is-julia-repl-supposed-to-choke-on-this/42089/1 "2020-06-26T04:45:28Z")

</div>

Julia 1.4.2 REPL completely chokes on this expression:

```julia
let
  n = 10_000

  struct Sensors
    depth::NTuple{n, Float32}
    bottom::Float32
    top::Float32
  end
  
  s = Sensors(ntuple(x->0, n), 0, 0)
end  

```

What is wrong with it?

---

<div class="post-metadata">

**Author:** ![affans](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/affans/32/11911_2.png) [@affans](https://discourse.julialang.org/u/affans)\
**Post date:** [June 26, 2020, 4:52am UTC](https://discourse.julialang.org/t/is-julia-repl-supposed-to-choke-on-this/42089/2 "2020-06-26T04:52:35Z")

</div>

Reproduced. Looks like a stack overflow.

```julia
julia> let
         n = 10_000

         struct Sensors
             depth::NTuple{n, Float32}
                 bottom::Float32
                     top::Float32
                       end

         s = Sensors(ntuple(x->0, n), 0, 0)
       end

Internal error: encountered unexpected error in runtime:
StackOverflowError()
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944
jl_typemap_array_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:969 [inlined]
jl_typemap_level_insert_ at /buildworker/worker/package_linux64/build/src/typemap.c:1010
jl_typemap_insert_generic at /buildworker/worker/package_linux64/build/src/typemap.c:944

```

---

<div class="post-metadata">

**Author:** ![WschW](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/wschw/32/6575_2.png) [@WschW](https://discourse.julialang.org/u/WschW)\
**Post date:** [June 26, 2020, 5:15am UTC](https://discourse.julialang.org/t/is-julia-repl-supposed-to-choke-on-this/42089/3 "2020-06-26T05:15:45Z")

</div>

Tuples with a large number of elements tend to result in longer compile times and worse code being generated. For anything over 32? elements I would suggest using an array instead.

In this case it appears that trying to specialize the code for a 10,000 element Tuple caused a stack overflow in the compiler.

---

<div class="post-metadata">

**Author:** ![pauljurczak](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pauljurczak/32/921_2.png) [@pauljurczak](https://discourse.julialang.org/u/pauljurczak)\
**Post date:** [June 26, 2020, 5:55am UTC](https://discourse.julialang.org/t/is-julia-repl-supposed-to-choke-on-this/42089/4 "2020-06-26T05:55:09Z")

</div>

I was trying to use a large tuple, in fact I need much more than 10,000 elements, because the examples I googled, suggested `NTuple{n, Float32}` as a type compatible with C array `float[n]`. I will try `Array{Float32, 1}` in that role.

---

<div class="post-metadata">

**Author:** ![WschW](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/wschw/32/6575_2.png) [@WschW](https://discourse.julialang.org/u/WschW)\
**Post date:** [June 26, 2020, 6:01am UTC](https://discourse.julialang.org/t/is-julia-repl-supposed-to-choke-on-this/42089/5 "2020-06-26T06:01:54Z")

</div>

I see, if your trying to be make a type with the same layout as a c struct then `Array{Float32,1}` won’t work. What about using `NTuple{100, NTuple{100, Float32} }` I believe that should have the same layout in terms of bytes.

---

<div class="post-metadata">

**Author:** ![pauljurczak](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pauljurczak/32/921_2.png) [@pauljurczak](https://discourse.julialang.org/u/pauljurczak)\
**Post date:** [June 26, 2020, 6:36am UTC](https://discourse.julialang.org/t/is-julia-repl-supposed-to-choke-on-this/42089/6 "2020-06-26T06:36:31Z")

</div>

Are you sure? I’m doing more reading on this subject and I found this example in Julia manual:

```julia
julia> A = [1.3, -2.7, 4.4, 3.1]
4-element Array{Float64,1}:
  1.3
 -2.7
  4.4
  3.1

julia> ccall(:qsort, Cvoid, (Ptr{Cdouble}, Csize_t, Csize_t, Ptr{Cvoid}),
             A, length(A), sizeof(eltype(A)), mycompare_c)

```

It indicates that I should be able to read C array `float[n]` via `Ptr{Float32}`.

---

<div class="post-metadata">

**Author:** ![WschW](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/wschw/32/6575_2.png) [@WschW](https://discourse.julialang.org/u/WschW)\
**Post date:** [June 26, 2020, 6:54am UTC](https://discourse.julialang.org/t/is-julia-repl-supposed-to-choke-on-this/42089/7 "2020-06-26T06:54:40Z")

</div>

I am talking about the layout within the struct.

```julia
struct Sensors
    depth::NTuple{n, Float32}
    bottom::Float32
    top::Float32
  end

```

and

```julia
struct Sensors
    depth::Array{Float32, 1}
    bottom::Float32
    top::Float32
  end

```

Have different layouts. The first has the same layout as the following c struct.

```nohighlight
struct Sensor {
  float depth[10000];
  float bottom;
  float top;
};

```

While the second one would have a pointer to the Julia array rather then storing the data within the struct

---

<div class="post-metadata">

**Author:** ![pauljurczak](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pauljurczak/32/921_2.png) [@pauljurczak](https://discourse.julialang.org/u/pauljurczak)\
**Post date:** [June 26, 2020, 7:17am UTC](https://discourse.julialang.org/t/is-julia-repl-supposed-to-choke-on-this/42089/8 "2020-06-26T07:17:08Z")

</div>

I see. I have a lot of flexibility, since I’m writing both Julia and C ends. I don’t have to pass a C struct, I can pass each field individually, if it’s easier. I know how to pass simple types, but I’m not sure how to deal with `float[]`. I just need to read from C array. What is the easiest way? `NTuple{100, NTuple{100, Float32} }` changes the dimensionality, which I would like to avoid.

---

<div class="post-metadata">

**Author:** ![Elrod](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/elrod/32/22461_2.png) [@Elrod](https://discourse.julialang.org/u/Elrod)\
**Post date:** [June 26, 2020, 7:26am UTC](https://discourse.julialang.org/t/is-julia-repl-supposed-to-choke-on-this/42089/9 "2020-06-26T07:26:33Z")

</div>

I think `Array{Float32,1}` is easier.  
Note that this should work:

```julia
n = 10_000

struct Sensors{n}
    depth::NTuple{n, Float32}
    bottom::Float32
    top::Float32
end

sr = Ref{Sensors{n}}();

```

But then reading from `sr` will be much more annoying than reading from an array.

---

<div class="post-metadata">

**Author:** ![pauljurczak](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pauljurczak/32/921_2.png) [@pauljurczak](https://discourse.julialang.org/u/pauljurczak)\
**Post date:** [June 26, 2020, 7:39am UTC](https://discourse.julialang.org/t/is-julia-repl-supposed-to-choke-on-this/42089/10 "2020-06-26T07:39:31Z")

</div>

How would I do it with an array? I don’t need `struct Sensors`, I can use individual array: `float depth_c[10000]` on C side. How do I read from `depth_c` into `depth_julia::Array{Float32, 1}`? Is there an `Array` constructor from a memory blob?

---

<div class="post-metadata">

**Author:** ![Elrod](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/elrod/32/22461_2.png) [@Elrod](https://discourse.julialang.org/u/Elrod)\
**Post date:** [June 26, 2020, 7:41am UTC](https://discourse.julialang.org/t/is-julia-repl-supposed-to-choke-on-this/42089/11 "2020-06-26T07:41:51Z")

</div>

There is `unsafe_wrap` if you’re creating the array in `C`, but as you’re writing the `C` I’d recommend allocating the array in Julia and passing it to C to fill it.

---

<div class="post-metadata">

**Author:** ![pauljurczak](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pauljurczak/32/921_2.png) [@pauljurczak](https://discourse.julialang.org/u/pauljurczak)\
**Post date:** [June 26, 2020, 7:51am UTC](https://discourse.julialang.org/t/is-julia-repl-supposed-to-choke-on-this/42089/12 "2020-06-26T07:51:23Z")

</div>

In C, I can assure a fixed address of `float depth_c[10000]` over the lifetime of my program. Can I create Julia array `depth_julia::Array{Float32, 1}`, pass its pointer to C (`pointer(depth_julia)` I presume) and assume that it will be fixed and valid over the lifetime of my program? `depth_julia` will be fixed size and read only on Julia side.

---

<div class="post-metadata">

**Author:** ![pauljurczak](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pauljurczak/32/921_2.png) [@pauljurczak](https://discourse.julialang.org/u/pauljurczak)\
**Post date:** [June 26, 2020, 9:45am UTC](https://discourse.julialang.org/t/is-julia-repl-supposed-to-choke-on-this/42089/14 "2020-06-26T09:45:24Z")

</div>

Thanks. I will follow your advice and pass Julia objects to C. So far it seems to be working. I found lifetime information at: [Calling C and Fortran Code · The Julia Language](https://docs.julialang.org/en/v1/manual/calling-c-and-fortran-code/#Garbage-Collection-Safety-1)

---

<div class="post-metadata">

**Author:** ![Elrod](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/elrod/32/22461_2.png) [@Elrod](https://discourse.julialang.org/u/Elrod)\
**Post date:** [June 26, 2020, 1:26pm UTC](https://discourse.julialang.org/t/is-julia-repl-supposed-to-choke-on-this/42089/15 "2020-06-26T13:26:17Z")

</div>

I’m just repeating some of what your link says, but in case not everyone clicks through:

> [@pauljurczak](#):
>
> pass its pointer to C ( `pointer(depth_julia)` I presume)

To pass as a pointer to `C`, all you need is to pass `depth_julia`, declared as a `Ptr{Float32}` argument.  
Then “under the hood”, it will call `Base.unsafe_convert`:

```julia
julia> small_depth_julia = rand(Float32, 4)
4-element Array{Float32,1}:
 0.6620523
 0.134426
 0.8403262
 0.5449269

julia> Base.unsafe_convert(Ptr{Float32}, small_depth_julia)
Ptr{Float32} @0x00007f3b9eaccbf0

```

Doing it this was has the advantage of protecting it from Julia’s GC.
