指向结构的指针的大小

时间:2014-05-20 13:31:24

标签: c pointers structure

我试图记住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字节的总分配大小吗?

感谢。

3 个答案:

答案 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)
}