Ok, let's spot the errors:
void double_min_max(int **range, int min, int max)
{
range = (int **)malloc(sizeof(int)* 10);
The cast with malloc is unnecessary and could even lead to problems. Don't do this.
Then you want to assign to *range
, not to range
. range
is local to your function (all arguments are passed by value in C), so modifying it will never have any effect visible to the calling code. When you call this function, you should pass a pointer to a pointer, so the pointer can be modified by the function through *range
.
Finally, this should be obvious, but you should calculate the required size from your min
and max
. The 10
is just a ... uhm ... very rough guess. Not a good idea.
int i = 0;
while (min < max)
{
**range[i] = min;
This is wrong. []
does dereference the pointer, so you have three levels of dereferencing here. But it's only a pointer to pointer, not pointer to pointer to pointer. Also, indexing precedes the normal dereference, not what you want. Use (*range)[i]
instead.
i++;
min++;
}
}
A sensible implementation could look like this:
size_t double_min_max(int **range, int min, int max)
{
// check for valid input
if (min > max) return 0;
// calculate required size
size_t size = max - min + 1;
*range = malloc(size * sizeof **range);
// check allocation succeeded:
if (!*range) return 0;
for (size_t i = 0; i < size; ++i)
{
(*range)[i] = min++;
}
return size;
}
Call it like this:
int *range;
size_t result = double_min_max(&range, 10, 20);
// result should now be 11, the size of the array `range` points to
// when done:
free(range);