我在C ++程序中声明了以下结构:
struct person {
char name[10]; /* first name */
char id[10]; /* ID number */
off_t pos; /* position in file, for demonstration */
} people[] = {
{ "arnold", "123456789", 0 },
{ "miriam", "987654321", 10240 },
{ "joe", "192837465", 81920 },
};
j = sizeof(people) / sizeof(people[0]); /* count of elements */
这里给出j = 3,即数组中没有元素;总是即使你添加或减少元素......
但是
char b[8];
i = sizeof(b)/sizeof(b[0]);
在我的机器上给出i = a constant = 4的值。
现在这是合理的,因为sizeof(char *)在我的机器上是常量,而sizeof(char)也是常量..
但是一旦我声明了struct person,sizeof(person *)和sizeof(person)也应该是常量,并且它也应该产生一个常量值,不是吗???
答案 0 :(得分:5)
你的编译器错了。
char b[8];
i = sizeof(b)/sizeof(b[0]);
应该产生i==8
。
您获得struct
尺寸的结果是正确的。如果我是你,我会切换编译器。
如果你要将b
传递给计算大小的函数,那么你就是对的。但是现在代码是,没有。
另外,如果它是一个计算sizeof(people) / sizeof(people[0])
的函数,它接收people
作为参数,你也会得到一个常数。
这是因为当作为参数传递时,数组会衰减为指针。
答案 1 :(得分:4)
你确定你实际上是将sizeof
应用于数组而不是指针吗?
在这种情况下,函数参数实际上是一个指针,因此你将获得i == sizeof(char*)
:
void f(char b[8]) {
i = sizeof(b)/sizeof(b[0]);
}
您发布的代码肯定会给出数组元素的数量。如果没有,那么你在代码中得到了一些非常奇怪的东西,或者你的编译器被无可救药地打破了。
答案 2 :(得分:1)
char b[8];
i = sizeof(b)/sizeof(b[0]);
这应该只给出值8。 sizeof(b)将给出数组的大小,而不是您所感知的sizeof(char *)。