【问题标题】:sizeof whole struct with member带有成员的整个结构的大小
【发布时间】:2015-11-05 07:08:17
【问题描述】:

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

例如这是我的结构:

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!!!!!!!!!!!!!!!!!!!!!”而不是“你好世界!”这会修改足迹内存,我需要知道这一点。

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

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

【问题讨论】:

  • 那是sizeof hello + strlen(hello.chaine) + 1。 (但是对于包含指针的任意结构,没有办法概括这一点。)
  • 有一些答案here,包括我以外的答案,详细讨论了这个问题。
  • “具有多个成员的结构的实际大小”是sizeof hello。注意到更多,没有更少。

标签: c typedef sizeof


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    因此,您总共得到 16 个字节。因此它正在做你要求它做的事情。

    如果你想要struct 的大小和struct 指向的东西的大小,请使用

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

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

    【讨论】:

    • sizeof(float) 可能比sizeof(int) 更一致地为 4。
    • 好吧,这正是我要问的。非常感谢您快速准确的回复。
    • @Lion.24 无需感谢,但我们将不胜感激。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 哦,是的,关于“你需要学习”的 +1 太多了。这个设置是为了尽快访问 segfault Land real。 ;-)
      • A char * 总是 8 个字节。
      • @EOF:我是说他的编译器。
      猜你喜欢
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 2017-06-20
      • 2017-12-23
      • 2019-08-18
      • 2013-09-07
      • 1970-01-01
      相关资源
      最近更新 更多