Q:

Converting std::list to C friendly type

What's the most elegant way to return a std::list object from a shared lib function (implemented by C++ code) to a C consumer?  I know for std::vector, we can return the address of the 1st element of the vector and have the consumer treat it as an array, but std::list is implemented as a linked lis. 

A:

Copy the std::list to a std::vector and return the address of the first element, as you already mentioned. 
(Of course, this may mean that you don't want to be using a std::list in the first place.) 
(This solution assumes that the object being accessed is owned by the C++ library -- If this isn't the case, you may need to consider allocating the memory from your C code and passing a pointer into the C++ library to copy the data.) 

A:

you always can make a copy:
list<int> lst;
int *arr = new int[lst.size()];
copy(lst.begin(),lst.end(),arr);

