实施例
#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)的大小吗?
答案 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
弄糊涂。 int
和int *
在某些平台上的大小相同。
答案 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个字节,这是组成指针的字节数。