Search code examples
cgnu

how to use the GNU hcreate_r


#include <stdio.h>
#include <stdlib.h>
#include <search.h>
#include <assert.h>

char *data[] = { "alpha", "bravo", "charlie", "delta",
      "echo", "foxtrot", "golf", "hotel", "india", "juliet",
      "kilo", "lima", "mike", "november", "oscar", "papa",
      "quebec", "romeo", "sierra", "tango", "uniform",
      "victor", "whisky", "x-ray", "yankee", "zulu"
       };

int
main(void)
{
    ENTRY e, **ep;
    struct hsearch_data *htab;
    int i;
    int resultOfHcreate_r;
    resultOfHcreate_r=hcreate_r(30,htab);
    assert(resultOfHcreate_r!=0);
    hdestroy_r(htab);
    exit(EXIT_SUCCESS);
}

error in hcreate_r

How to use this hcreate_r?

and other question is that :

Could you privde the GNU extension C library examples ? I think the document of GNU extension C library is not enough knowledge to write.

and I have many questions of how to use the extension C library .


Solution

  • First off, you will need to add the #define _GNU_SOURCE macro in order to access the GNU extensions properly. ie:

    #define _GNU_SOURCE
    #include <search.h>
    

    Then you need to understand the documentation:

    Function: int hcreate_r (size_t nel, struct hsearch_data *htab)

    The hcreate_r function initializes the object pointed to by htab to contain a 
    hashing table with at least nel elements. So this
    function is equivalent to the hcreate function except that the
    initialized data structure is controlled by the user.
    
    This allows having more than one hashing table at one time. 
    The memory necessary for the struct hsearch_data object can be allocated
    dynamically. It must be initialized with zero before calling this
    function.
    
    The return value is non-zero if the operation was successful. 
    If the return value is zero, something went wrong, which probably means
    the programs ran out of memory.
    


    So unlike hcreate, you are providing the hashing table data structures. Further, those structures should be initialised to zero. So then you probably want to do something like this:

    //dynamically create a single table of 30 elements 
    htab=calloc(1,sizeof(struct hsearch_data));
    resultOfHcreate_r=hcreate_r(30,htab);
    
    //do some stuff
    
    //dispose of the hash table and free heap memory
    hdestroy_r(htab);
    free(htab)