stock_list_ptr * slist_ptr = ...
so slist_ptr
is a pointer to a stock list pointer
tm->stock
is just a stock list pointer.
You should also goole why casting the result of malloc is a bad idea..
Also:
/* malloc memory (size = 1 pointer) and assign address to stock_list_ptr */
stock_list_ptr * slist_ptr = (stock_list_ptr *) malloc(sizeof(stock_list_ptr));
slist->head_stock = snode;
/* assign address of slist to slist_ptr. So you have overwritten the assignment
above, and leaked 1 pointer's worth of memory.
stock_list_ptr slist_ptr = &slist; is proabably what you meant...
*/
slist_ptr = &slist;