Question

I'm writing code for an assignment where we have to create a hashtable. One of the functions is to get all the keys within the hash table and assign it into a char* ** (triple pointer) given by the parameters. The char* ** is presumed to be empty, and so we have to allocate memory to it within the function to fit all the keys.

The problem I'm having is where, after I allocate memory (and presumably the right amount, with strlen + 1), the program crashes and valgrind gives me an error message of invalid read of size 8, as well as a bunch of unconditional jumps and finally Process terminating with default action of signal 11 (SIGSEGV) Access not within mapped region at address 0x0.

int GetKeys( HashTablePTR hashTablePtr, char ***keysArrayHandle, unsigned int *keyCount )
{
HashTablePTR head;
int counter = 0;
size_t length = 0;
*keyCount = 0;
head = hashTablePtr;

if (NULL == hashTablePtr || 0xDEADBEEF != hashTablePtr[0].sentinel)
{
    return(-1);
}
else
{
    // Get key count
    for (int i = 0; i < (int) head[0].range; i++)
    {
        hashTablePtr = &(head[i]);
        while (NULL != hashTablePtr && NULL != hashTablePtr->key)
        {
            *keyCount = *keyCount + 1;
            hashTablePtr = hashTablePtr->next;
        }
    }
    printf("keyCount: [%d]\n", *keyCount);
}

keysArrayHandle = malloc(sizeof(char **) * (*keyCount));

for(int j = 0; j < (int) head[0].range; j++)
{
    hashTablePtr = &(head[j]);
    while (NULL != hashTablePtr && NULL != hashTablePtr->key && counter < *keyCount)
    {
        length = strlen(hashTablePtr->key) + 1;
        keysArrayHandle[counter] = malloc(sizeof(char) * length);
        printf("%s\n", hashTablePtr->key);
        ///////SOMETHING IS WRONG WITH THIS LINE UNDERNEATH////////
        memcpy(*(keysArrayHandle[counter]), hashTablePtr->key, length);
        printf("String copied\n");
        counter++;
        hashTablePtr = hashTablePtr->next;
    }
}

return(0);

}

Was it helpful?

Solution

keysArrayHandle[counter] = malloc(sizeof(char) * length);

returns a pointer to keysArrayHandle[counter].
Then you are using *(keysArrayHandle[counter]) instead of keysArrayHandle[counter] in memcpy.

maybe you should

*(keysArrayHandle[counter]) = malloc(sizeof(char) * length);

valter

OTHER TIPS

I think you should not dereference that pointer there

  something = malloc(size);
  memcpy(something, x, size); /* instead of memcpy(*something ... */

Also, check mpthe value returned by malloc

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top