sizeof整个结构与成员

时间:2015-08-12 15:13:19

标签: c typedef sizeof

很抱歉这个愚蠢的问题,但我怎么知道其中有几个成员的结构的实际大小。

例如,这是我的结构:

typedef struct mastruct mastruct;
struct mastruct{
    int val;
    char *chaine;
    float decimal;
}__attribute__((packed));

和矫揉造作:

mastruct hello =
{
    23,
    "Hello world!",
    3.141592654
};

printf给我回复:

printf("int : %d, char* : %d, float : %d\n", sizeof(int), sizeof(char*), sizeof(float));
printf("struct size : %d\n", sizeof(hello));

int : 4, char* : 8, float : 4
struct size : 16

这是正常的,因为int + char * + float = 16字节,但这不是我想要的。我想知道内存中结构的完整大小。

例如,如果我正在撰写" Hello world !!!!!!!!!!!!!!!!!!!!!!!"而不是" Hello world!"这会修改足迹记忆,我需要知道。

通过这个例子,如果我打印结构的大小,我仍然得到16个字节:

mastruct hello =
    {
        23,
        "Hello world! Hellooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo",
        3.141592654
    };

4 个答案:

答案 0 :(得分:3)

char*是一个指针。它总是8个字节(或者你的架构中的任何大小的指针;在32位系统上,它是4个字节)。实际的字符串数据存在于其他地方,并且不属于#34;通过结构以任何方式。

您需要了解指针和内存管理。

答案 1 :(得分:1)

首先,您必须以某种方式安全地管理链接的内存。如果您使用malloc系列直接分配它,那么您已经知道了它的大小。 如果您要将其指向堆栈上的char数组,那么您又已经知道了大小(如果有疑问,请使用sizeof或strlen)。 关键是你必须寻找2种尺寸: 1.你的结构,包括(sizeof char *) 2.链条指向的实际字符串 请记住,您的char数组和结构不太可能是连续的,因此您无法使用此最终大小进行索引。

答案 2 :(得分:0)

sizeof运算符返回其操作数的大小。在这种情况下,操作数是hello,其类型为struct mastruct,因此它将生成结构本身的大小,即成员变量的大小,以及填充(如果有)。

没有办法,它可以通过指针类型成员变量来测量指向的内存位置的大小。

此外,FWIW,如果不是结构成员,sizeof将返回变量本身的类型(指针类型的大小),而不是分配的内存量,指针变量。

答案 3 :(得分:0)

您的代码正常运行。它列出了结构的大小。 struct包含:

  • 一个int(4个字节)
  • A char *(32位为4个字节,64位为8个字节)
  • A float(此处为4个字节)

因此总共得到16个字节。因此,它正在按照你的要求去做。

如果您想要struct的大小和struct所指向的事物的大小,请使用

sizeof(hello) + strlen(hello.chaine) + 1

+ 1用于终止零。请注意,多个struct条目可能指向相同的字符串(取决于您设置的方式),因此这不一定代表就此项目分配的总内存(仅限)。同样,它可能指向一个常量字符串,在这种情况下,不会分配(动态)内存。