不同数据类型的sizeof(数据类型指针)/ sizeof(数据类型)的值不同,为什么?

时间:2012-03-08 14:11:17

标签: c++ c arrays pointers sizeof

我在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)也应该是常量,并且它也应该产生一个常量值,不是吗???

3 个答案:

答案 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 *)。