So as much as most people (me included) tend to believe otherwise, pointers and arrays are NOT the same in C and this is one of the few cases this difference matters.
Basically, t_calcephcharvalue is an array type and t_calcephcharvalue* is a pointer to the array type and not the pointer type. Or in another word, the type of arrayvalue[0] is an array and not a pointer and the offset between the address of arrayvalue[0]and arrayvalue[1] is the size of t_calcephcharvalue and not char*. Or in yet another word, arrayvalue points to a piece of memory that is holding many (an array of) fixed length strings (each with length CALCEPH_MAX_CONSTANTVALUE) laid right next to each other. It does NOT point to an array of pointers pointing to the strings.
With that in mind, what you need should be storage = Array{UInt8}(CALCEPH_MAX_CONSTANTVALUE, numberOfValues) and pass storage directly to the C function with argument type Ptr{UInt8}.
P.S. C array and pointer can easily be confusing. It usually makes sense but I usually check to make sure since it’s so rarely used (for me). LLVM IR is a pretty good way to check this.
storage = Array{UInt8}(_maxConstValue,numberOfValues)
stat = ccall((:calceph_getconstantvs , libcalceph), Cint,
(Ptr{Void},Ptr{UInt8},Ptr{UInt8}, Cint),
eph.data, name ,storage, numberOfValues)
values = [ strip(unsafe_string(pointer(storage,i))) for i in 1:_maxConstValue:length(storage) ]
mission_units = (t_calcephcharvalue*)malloc(sizeof(t_calcephcharvalue)*nvalue);
/* fill the array radii */
if (calceph_getconstantvs(peph, "MISSION_UNITS", mission_units, nvalue))