问题
I was trying to remember the basics of C programming, and regarding pointers to structures I was doing the following:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int main()
{
struct MyStruct {
int number;
char *name;
};
int i;
struct MyStruct *p_struct = (struct MyStruct *) malloc (sizeof(struct MyStruct)*3);
printf("sizeof(struct MyStruct) = %d\n", sizeof(struct MyStruct));
for (i=0; i<3;i++)
{
(*p_struct).number = i;
(*p_struct).name = "string";
printf("(*p_struct).number = %d, (*p_struct).name = %s\n", (*p_struct).number (*p_struct).name);
++p_struct;
}
printf("sizeof(p_struct) = %d\n", sizeof(p_struct));
free (p_struct);
return 1;
}
My question is: I get 8 bytes as the size of the structure, which is okay as 4+4 = 8 bytes due to alignment/padding of the compiler, but why do I get 4 bytes from sizeof(p_struct)?
I was expecting to get 24 (8 bytes x 3), why is this so?
If this is correct, can I get the total allocated size of 24 bytes somehow?
Thanks.
回答1:
No, the size of the structure is eight bytes because you have two four-byte fields in it, try printing sizeof(int) and sizeof(char *) and see for yourself.
When you do sizeof of a pointer, you always gets the size of the pointer and never what it points to. There is no way (in standard C) to get the size of memory you have allocated with malloc.
Also note that you have undefined behavior in your code, as you change the pointer p_struct so it no longer points to what your malloc call returned. This leads to the undefined behavior when you try to free that memory.
回答2:
Pointers are always the same size on a system no matter what they're pointing to (int, char, struct, etc..); in your case the pointer size is 4 bytes.
回答3:
p_struct is a pointer to a struct. Pointers usually take either 4 or 8 bytes. If you wanted to know the size of the struct itself, you would use sizeof (*p_struct).
Note that your code is likely to crash, because you increased p_struct three times, and then call free () on the result, not on the original pointer that malloc returned. Much clearer and safer to write for example
for (i=0; i<3;i++)
{
p_struct [i]->number = i;
p_struct [i]->name = "string";
printf("(*p_struct).number = %d, (*p_struct).name = %s\n", p_struct [i]->number p_struct [i]->name)
}
来源:https://stackoverflow.com/questions/23761267/size-of-a-pointer-pointing-to-a-structure