【问题标题】:Different values of sizeof(datatype_pointer)/sizeof(datatype) for different datatypes, why?不同数据类型的sizeof(datatype pointer)/sizeof(data type)值不同,为什么?
【发布时间】:2012-03-08 14:11:17
【问题描述】:

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

【问题讨论】:

  • 我不相信 char 变体总是给你 4... (ideone.com/eeniL)
  • 它在我的机器上给出了 4,我执行了代码。 sizeof(char*) 取决于在我的机器上容纳地址所需的字节数,并且 sizeof(char) 始终为 1,不是吗。所以,它需要 4*sizeof(char) 来容纳我机器上的地址...
  • 这篇文章很好地说明了为什么人们应该发布完整的程序而不是代码片段。请发布最短的完整程序来演示您的问题。 sscce.org
  • 但是在上面的代码中,你没有char*,你有一个char[8]
  • @Oli Charlesworth:我的编译器做了一些奇怪的事情,我用 Microsoft Visual C++ 尝试了代码,它可以工作..

标签: c++ c arrays pointers sizeof


【解决方案1】:

你的编译器错了。

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

应该产生i==8

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

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

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

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

【讨论】:

  • 我用 Microsoft Visual C++ 试了一下代码,现在可以运行了,谢谢!!
【解决方案2】:

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

在这种情况下,函数参数实际上是一个指针,所以你会得到i == sizeof(char*)

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

您发布的代码肯定应该给出数组元素的数量。如果不是这样,那么您的代码中要么有其他非常奇怪的东西,要么您的编译器已无可救药地损坏了。

【讨论】:

    【解决方案3】:
      char b[8];          
      i = sizeof(b)/sizeof(b[0]); 
    

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

    【讨论】:

      猜你喜欢
      • 2012-06-14
      • 1970-01-01
      • 2019-08-17
      • 2012-07-29
      • 2021-05-12
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多