Search code examples
cmallocrealloc

Formal malloc to use realloc later


Below code is just an example which I use to come to the point later:

/* Extract digits from an integer and store in an array in reverse order*/

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

int main(void)
{
    int oct=316;
    int* array=malloc(0*sizeof(int*));  //Step 1
    int* temp;
    size_t size=0;
    while(oct/10>0 || oct%10>0){
        temp=realloc(array,++size*sizeof(int)); // Step2 requires Step1
        if(temp==NULL){
            printf("Can't reallocate memory");
            exit(-1);
        }
        else{
            array=temp;
        }

        array[size-1]=oct%10;
        oct/=10;
    }
    for(int i=0;i<size;i++)
    printf("%d\n",array[i]);

    return 0;
}

The realloc reference [1] states :

Reallocates the given area of memory. It must be previously allocated by malloc(), calloc(), realloc()...


Initially I compiled the code without step1 and on running it I got a segmentation fault. Then I included step1, now the code compiles fine. I don't want to allocate some space without finding an integer to store so I have used a size of zero with malloc. However malloc reference [2] states :

If size is zero, the return value depends on the particular library implementation (it may or may not be a null pointer), but the returned pointer shall not be dereferenced.

Now, I doubt my implementation is portable. How can I work around this issue?

I tried doing int* array=NULL; but I got a segmentation fault.


Solution

  • You can initiate array to NULL. In the man page for realloc(void *ptr, size_t size) you can read:

    If ptr is NULL, then the call is equivalent to malloc(size)

    Moreover realloc does not change its parameter. It returns pointer to newly allocated/reallocated space. So, for reallocating you shall use a code like:

    array = realloc(array,(++size)*sizeof(int));
    if (array == NULL) { some error; }