Re: invalid conversion from void* to int**
Old Wolf wrote:
Martin JHrgensen wrote:
void *alloc_mem (size_t num_elems, size_t elem_size,
char *filename, int line,
size_t *total_mem)
{
void *mem;
size_t size = num_elems*elem_size;
size += (sizeof (size_t) <= elem_size) ? elem_size
: sizeof (size_t);
Why not just use sizeof(size_t) ?
Actually I just implemented it after reading the suggestion from
somebody else. But the point is to store the allocated memory in the end
of each block. I think it has some technical explanation, something to
do with "off-numbered" memory address of whatever... I think somebody
else can explain it - nobody complained about it in comp.lang.c so I
think it's okay.
If we think about it, the least extra memory occupation must be sizeof
(size_t). If elem_size is larger than that, we reserve memory for
elem_size and I think it's got to do with hitting some memory boundary
address - anyone?
mem = malloc(size);
if (!mem)
{
fprintf(stderr, "%s: line %d, malloc(%lu) failed.\n",
filename, line, (unsigned long) size);
exit(EXIT_FAILURE);
}
/* save memory allocated for this pointer */
memcpy(((char *)mem)+num_elems*elem_size,
&size, sizeof size);
What is the purpose of storing that size there?
How are you planning to access it in future?
size_t retrieve_memsize (void *mem, size_t num_elems,
size_t elem_size)
{
size_t size = 0;
if (mem) {
memcpy(&size, ((char *)mem)+num_elems*elem_size,
sizeof size);
}
return size;
}
void free_mem (void *mem, size_t num_elems,
size_t elem_size, size_t *total_mem)
{
if (mem) {
size_t size = retrieve_memsize(mem, num_elems, elem_size);
free(mem);
*total_mem -= size;
}
}
*total_mem += size; /* update total memory allocated untill now */
You should check here , and in the mutliplication above,
that you don't overflow a size_t .
What do you mean? How should it overflow?
return mem;
}
- - - - - - - - - - - - - - - - - - - - - - - -
But I then declared some arrays like:
double **two_D_double;
int **two_D_int;
double *one_D_double;
int *one_D_int;
Those are pointers, not arrays.
You're right. I was thinking of what they pointed to instead.
etc. etc...
MS visual studio 2005 + gcc doesn't complain. But with g++ I get such an
error as:
"invalid conversion from void* to int**" (the same for double **)
You didn't post any code that would give that error.
It sounds like that, from the other replies in this thread...
Best regards / Med venlig hilsen
Martin JHrgensen
--
---------------------------------------------------------------------------
Home of Martin JHrgensen - http://www.martinjoergensen.dk