The purpose of this function is to remove the element with the highest index, which is basically the last element of the array. I ran this code with an array of length 5, and it ran fine all the way until it reached the point where the length of the array was 0. Then all of a sudden, it said aborted because of a failed assertion with ia->data. Why is it giving me an assertion error when it gets to a NULL array?
Here's the struct for my code:
typedef struct {
int* data;
unsigned int len;
} intarr_t;
Here is the function to remove the element with the highest index below:
intarr_result_t intarr_pop( intarr_t* ia, int* i )
{
unsigned int len = ia->len;
if (ia == NULL)
{
return INTARR_BADARRAY;
}
else
{
ia->data = realloc(ia->data, (sizeof(int)*(len-1)));
assert (ia->data);
if (ia->data != 0)
{
if (i != 0)
{
*i = ia->data[len-1]
ia->len = len-1;
return INTARR_OK;
}
}
else
{
return INTARR_BADINDEX;
}
}
return 0;
}
len
is declared as anunsigned int
. So iflen
is equal to 0, then the linewill try to allocate 4GB on a 32-bit machine, or some huge amount of memory on a 64-bit machine. Either way, if the allocation fails and
realloc
returnsNULL
, theassert
will fail.To avoid the problem, you need to handle
len == 0
as a special case.