我试图记住C编程的基础知识,关于结构的指针我正在做以下事情:
#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;
}
我的问题是:我得到8个字节作为结构的大小,由于编译器的对齐/填充,这可以是4 + 4 = 8个字节,但为什么我从sizeof(p_struct)
得到4个字节?
我期待得到24(8字节x 3),为什么会这样?
如果这是正确的,我可以以某种方式获得24字节的总分配大小吗?
感谢。
答案 0 :(得分:8)
不,结构的大小是八个字节,因为你有两个四字节字段,尝试打印sizeof(int)
和sizeof(char *)
并自己查看。
当你执行指针的sizeof
时,你总是得到指针的大小,而不是它指向的指针。没有办法(在标准C中)获得用malloc
分配的内存大小。
另请注意,代码中有undefined behavior,因为您更改了指针p_struct
,因此它不再指向您的malloc
调用返回的内容。当您尝试free
该内存时,这会导致未定义的行为。
答案 1 :(得分:2)
指针在系统上总是大小相同,无论它们指向什么(int,char,struct等);在你的情况下,指针大小是4个字节。
答案 2 :(得分:0)
p_struct是结构的指针。指针通常需要4或8个字节。如果您想知道结构本身的大小,可以使用sizeof(* p_struct)。
请注意,您的代码可能会崩溃,因为您增加了p_struct三次,然后对结果调用free(),而不是在malloc返回的原始指针上调用。写得更清楚,更安全
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)
}