不同数据类型的sizeof(datatype_pointer)/sizeof(datatype)值不同,原因何在

Different values of sizeof(datatype_pointer)/sizeof(datatype) for different datatypes, why?

本文关键字:datatype sizeof pointer 数据类型      更新时间:2023-10-16

我在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常数=4的值。

现在这是合理的,因为在我的机器上,sizeof(char*)是常量,而sizeof(char)也是常量。。

但是,一旦我声明了结构体person,sizeof(person*)和sizeof(person)也应该是常量,它也应该产生一个常数值,不是吗???

您的编译器错误。

char b[8];
i = sizeof(b)/sizeof(b[0]);

应产生CCD_ 1。

您得到的struct大小的结果是正确的。如果我是你,我会更换编译器。

如果您将b传递给计算大小的函数,那么您是对的。但按照现在的代码,没有。

此外,如果是一个计算sizeof(people) / sizeof(people[0])的函数,它接收people作为参数,那么你也会得到一个常数。

这是因为数组在作为参数传递时会衰减为指针。

您确定您实际上是在将sizeof应用于数组,而不是指针吗?

在这种情况下,函数参数实际上是一个指针,因此您将得到i == sizeof(char*):

void f(char b[8]) {
    i = sizeof(b)/sizeof(b[0]);
}

您发布的代码应该明确给出数组元素的数量。如果没有,那么你的代码中要么有其他非常奇怪的东西,要么你的编译器坏得无可救药。

  char b[8];          
  i = sizeof(b)/sizeof(b[0]); 

这应该只给出值8。sizeof(b)将给出数组的大小,而不是您所感知的sizeof(char*)。