获取结构值的大小

时间:2015-03-12 16:40:05

标签: c

实施例

#include <stdio.h>

struct A {
  char *b;
};

int main(int argc, char *argv[]) {
  char c[4] = { 'c', 'a', 't', '\0' };
  struct A a;
  a.b = c;
  printf("%s\n", a.b); // cat
  printf("%lu\n", sizeof c); // 4
  printf("%lu\n", sizeof a.b); // 8 ???
}

为什么sizeof a.b会返回8而不是4?如果我理解正确,a.b会返回分配给它的值,即c。但它不应该返回c(即4)的大小吗?

5 个答案:

答案 0 :(得分:3)

sizeof()运算符给出分配给对象的字节数,在您的情况下,对象是一个指针,其大小看起来像是系统上的8个字节。

答案 1 :(得分:2)

您在两种不同的类型上调用sizeof()

  • sizeof(a.b)sizeof(char *),在您的平台上为8。
  • sizeof(c)sizeof(char[4]),即4。

我们可以通过数组衰减指向数组指针,您可以在其他答案中阅读:What is array decaying?

答案 2 :(得分:1)

首先sizeof(a.b)的大小不是c。它没有给出指向的大小,而是指针的大小。

以char:

为例
  • char a的尺寸为1
  • char *b是4.(在64位上)

所以指针的大小不是指向它的大小。 请注意,这些尺寸与平台有关。

尽管不要被int弄糊涂。 intint *在某些平台上的大小相同。

答案 3 :(得分:1)

  

如果我理解正确,a.b将返回分配给它的值,

不完全是。 a.b就是所谓的左值。这意味着它指定内存位置。但它还没有读取那个内存位置;只有在我们在需要读取内存位置的更大上下文中使用a.b时才会发生这种情况。

例如:

a.b = something;    // does not read a.b
something = a.b;    // does read a.b

sizeof的情况是一个不读取内存位置的上下文。实际上它告诉你该内存位置包含多少字节;它没有告诉你存储在那里的东西(更别说关于存储在那里的东西可能指向的其他内存位置,如果它是一个指针)。

输出告诉您系统使用8个字节来存储指针。

答案 4 :(得分:-1)

sizeof()返回变量的字节数。 在这种情况下,sizeof(char *)返回8个字节,这是组成指针的字节数。