指向结构的指针的大小

c_b*_*c_b 5 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;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:我得到8个字节作为结构的大小,由于编译器的对齐/填充,这可以是4 + 4 = 8个字节,但为什么我从4个字节sizeof(p_struct)

我期待得到24(8字节x 3),为什么会这样?

如果这是正确的,我可以以某种方式获得24字节的总分配大小吗?

谢谢.

Som*_*ude 10

不,结构的大小是八个字节,因为你有两个四字节字段,尝试打印sizeof(int)sizeof(char *)亲自看看.

当你执行sizeof一个指针时,你总是得到指针的大小,而不是它指向的指针.没有办法(在标准C中)获得已分配的内存大小malloc.

另请注意,您在代码中有未定义的行为,因为您更改指针p_struct使其不再指向您的malloc调用返回的内容.当您尝试free该内存时,这会导致未定义的行为.


Cli*_*rce 6

指针在系统上始终具有相同的大小,无论它们指向什么(int、char、struct 等);在你的情况下,指针大小是 4 个字节。

  • 有些实现确实具有不同的大小,但目前这种情况非常罕见。我认为原始海报没有在这样的机器上学习。 (5认同)
  • 这通常是不正确的。在某些实现中,不同的指针具有不同的大小。 (2认同)
  • 一般来说,它*是*正确的。在某些特定和不寻常的情况下,它不是,但通常是正确的。 (2认同)