Advice on how to return a list of values

M

Michal Nazarewicz

Remo D. said:
Hi! I'm writing a function that returns an array of (at maximum) 64
pointers to char. I have thought of three possibility:

- The caller passes a pointer to a previously allocated array of 64
pointers. Similarly to sprintf(), the caller is entirely responsible
for handling the memory. The drawback is that my function will have to
rely on the correctness of such pointer to work properly.

IMO it's not a drawback really. The same goes with all standard library
functions operating on strings which are free to assume that user gave
them a valid string.
- My function allocates the array and returns it. This is similar to
strdup(). Here I will have to rely on the caller function to properly
free the array, which is something I'm not very comfortable with.

- I'll have a "static char *ret[64]" in my function and will return
ret. I've not been able to think of a library function that behaves
this way, so I guess it's not reccomended.

There are plenty. For instance strerror() may (as far as I know) do
such a thing. strtok() is another example of function that uses static
buffer.
The good is that I'm free
from allocation/freeing problem. The bad is that the return values
will be overwritten at each call; if the user wants to keep the return
values for subsequent use he has to copy and store them somewhere.

If your function does not need to be reentrant (ie. you are not writing
a multithread application this approach is (in my opinion) not bad and
I'd choose that.

However, if function needs to be reentrant I'd choose the "sprintf()"
approach, ie. user supplies buffer.
Another drawback is that it consumes memory even if the function will
never be called.

Come one... 64 pointers? That's not that much.
In my specific case, I was leaning toward the third option but
I'd like to hear your opinion on pitfalls, things that I've missed or
alternative approaches that could work better.

As I've said -- if you don't care about reentrant functions and
multithreading applications go ahead. But generally, I'd advice the
first option as you get reentrant function with no costs.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,756
Messages
2,569,535
Members
45,007
Latest member
OrderFitnessKetoCapsules

Latest Threads

Top