Home > Enterprise >  Is there a way to dereference a void pointer in C?
Is there a way to dereference a void pointer in C?

Time:10-08

The calloc function in C returns a void pointer but the memory bytes pointed to are already initialized with values, How is this is achieved?

I am trying to write a custom calloc function in C but can't find a way to initialize the allocated memory bytes

My code

#include "main.h"

/**
 * _calloc - Allocate memory for an array
 * @nmemb: Number of elements
 * @size: Size of each element
 *
 * Description: Initialize the memory bytes to 0.
 *
 * Return: a Void pointer to the allocated memory, if error return NULL
 */
void *_calloc(unsigned int nmemb, unsigned int size)
{
        unsigned int i, nb;
        void *ptr;

        if (nmemb == 0 || size == 0)
                return NULL;

        nb = nmemb * size;

        ptr = malloc(nb);

        if (ptr == NULL)
                return NULL;

        i = 0;
        while (nb--)
        {
/*How do i initialize the memory bytes?*/
                *(ptr   i) = '';
                i  ;
        }

        return (ptr);
}

CodePudding user response:

Simply use pointer to another type to dereference it.

example:

void *mycalloc(const size_t size, const unsigned char val)
{
    unsigned char *ptr = malloc(size);
    if(ptr) 
        for(size_t index = 0; index < size; index  ) ptr[index] = val;
    return ptr;
}

or your version:

//use the correct type for sizes and indexes (size_t)
//try to have only one return point from the function
//do not use '_' as a first character of the identifier 
void *mycalloc(const size_t nmemb, const size_t size)
{
    size_t i, nb;
    char *ptr = NULL;

    if (nmemb && size)
    {
        nb = nmemb * size;
        ptr = malloc(nb);
        if(ptr)
        {
            i = 0;
            while (nb--)
            {
                    //*(ptr   i) = 'z';
                    ptr[i] = 'z';  // isn't it looking better that the pointer version?
                    i  ;
            }
        }
    }
    return ptr;
}

Then you can use it assigning to other pointer type or casting.

example:

void printByteAtIndex(const void *ptr, size_t index)
{
    const unsigned char *ucptr = ptr;

    printf("%hhu\n", ucptr[index]);
}

void printByteAtIndex1(const void *ptr, size_t index)
{
 
    printf("%hhu\n", ((const unsigned char *)ptr)[index]);
}
  • Related