gcc 4.4.1 c89
I have the following code snippet:
#include <stdlib.h>
#include <stdio.h>
char *buffer = malloc(10240);
/* Check for memory error */
if(!buffer)
{
fprintf(stderr, "Memory error\n");
return 1;
}
printf("sizeof(buffer) [ %d ]\n", sizeof(buffer));
However, the sizeof(buffer) always prints 4. I know that a char* is only 4 bytes. However, I have allocated the memory for 10kb. So shouldn't the size be 10240? I am wondering am I thinking right here?
Many thanks for any suggestions,
Replace your
sizeof
bymalloc_usable_size
(the manpage indicates that this is non-portable, so may not be available with your particular C implementation).You are asking for the size of a
char*
which is 4 indeed, not the size of the buffer. Thesizeof
operator can not return the size of a dynamically allocated buffer, only the size of static types and structs known at compile time.sizeof
doesn't work on dynamic allocations (with some exceptions in C99). Your use ofsizeof
here is just giving you the size of the pointer. This code will give you the result you want:If
malloc()
succeeds, the memory pointed to is at least as big as you asked for, so there's no reason to care about the actual size it allocated.Also, you've allocated 10 kB, not 1 kB.
It is up to you to track the size of the memory if you need it. The memory returned by malloc is only a pointer to "uninitialized" data. The sizeof operator is only working on the
buffer
variable.No.
buffer
is achar *
. It is a pointer tochar
data. The pointer only takes up 4 bytes (on your system).It points to 10240 bytes of data (which, by the way, is not 1Kb. More like 10Kb), but the pointer doesn't know that. Consider:
It's the main difference between arrays and pointers. If it didn't work that way,
sizeof p
would change in the above code, which doesn't make sense for a compile-time constant.