【问题标题】:Result of 'sizeof' on array of structs in C?C中结构数组的'sizeof'结果?
【发布时间】:2010-12-26 07:12:39
【问题描述】:

在 C 中,我有一个结构数组,定义如下:

struct D
{
    char *a;
    char *b;
    char *c;
};

static struct D a[] = {
    {
        "1a",
        "1b",
        "1c"
    },
    {
        "2a",
        "2b",
        "2c"
    }
};

我想确定数组中元素的数量,但sizeof(a) 返回的结果不正确:48,而不是 2。我做错了什么,还是sizeof 在这里根本不可靠?如果这很重要,我将使用GCC 4.4 进行编译。

【问题讨论】:

标签: c arrays struct sizeof


【解决方案1】:

sizeof 为您提供以字节为单位的大小,而不是元素的数量。正如 Alok 所说,要获得元素的数量,请将数组的字节大小除以一个元素的字节大小。正确的C习语是:

sizeof a / sizeof a[0]

【讨论】:

  • 另一种惯用的版本是sizeof a / sizeof *a
【解决方案2】:
sizeof a / sizeof a[0];

这是一个编译时常量,因此您可以使用它来创建另一个数组:

#define N sizeof a / sizeof a[0]
int n_a[N];

【讨论】:

  • 在这种情况下,如果 sizeof(a) 为 48,则 sizeof(a[0]) == 24。这使得每个 char * 占用 8 个字节。 sizeof(char *) 可能是 4 或 8,具体取决于 32 位/64 位,但编译器会字对齐结构成员,因此每个元素最终占用 8 个字节。
  • 是的,但好的是,无论是否有填充,或者struct 的大小,除法都会给出正确的大小。
  • #define 结尾不应该有分号
  • 请注意,如果将“a”声明为extern,这可能不起作用(尽管在原始问题中并非如此)。如果 sizeof(a) 在另一个源文件中声明,编译器将无法在编译时确定它。
  • 宏应该用括号括起来
【解决方案3】:

sizeof 返回传递元素在内存中的大小。通过将数组的大小除以单个元素的大小,可以得到元素数。

请注意,元素大小也可能包括一些填充字节。因此,填充结构(例如,当 char 成员后跟指针时)将具有大于其成员大小总和的 sizeof 值。

另一方面,在计算数组中的元素时不要让它打扰您:sizeof(a) / sizeof(a[0]) 仍将像预期的那样顺利工作。

【讨论】:

    【解决方案4】:

    ssize_t portfoySayisi = sizeof(*portfoyler);

    这个很有效

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-27
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多