【问题标题】:A strange sizeof() bug occured on DevC++Dev C++ 上出现了一个奇怪的 sizeof() 错误
【发布时间】:2011-12-28 16:30:57
【问题描述】:

我知道我不应该使用 Dev-C++,但它在学校是强制性的,所以我对此无能为力。

主题是 C/C++ 中的指针,在测量整数数组的长度时出现错误。请看下面的代码:

// POINTER
# include<iostream>
# include<string.h>

using namespace std;

int main(){
    //neues Feld anlegen
    int *a = new int[5];

    a[0] = 12;
    a[1] = 5;
    a[2] = 43;
    a[3] = -12;
    a[4] = 100;
    // Feld füllen

    for(int i = 0; i<sizeof(a);i++){
            cout<<a[i]<<"\n"<<endl;
            }
    cout<<sizeof(a);
    system("pause");
    return 0;

}

sizeof() 返回 4 而不是 5...有什么想法吗?

【问题讨论】:

  • 我的第一个想法是,除非你是上帝,否则你永远不应该认为意外行为是别人的错,尤其是“编译器错误”。唯一正确的问题是“在这段代码中我哪里看不懂 C 和 C++?”
  • “所以我对此无能为力。”我感觉到你的痛苦,但你至少可以将你的导师指向the information here。 :)
  • sizeof 中的错误对于编译器来说几乎是不可能的,这意味着如果 sizeof 被破坏,几乎所有东西都会被破坏!编译器中的错误很少见,Microsoft 和 GCC 有一些,但前提是你做了一些非常奇怪的事情,尤其是模板!
  • 数组不是指针;指针不是数组。从第 6 节开始阅读comp.lang.c faq :)
  • 澄清一件事:sizeof(a) 不会是 5,即使 a 的类型实际上是 int[5]

标签: c++ c arrays dev-c++


【解决方案1】:

这不是错误,因为它返回 a 本身的大小(类型为 int* - 在 32 位构建上为 4 个字节),而不是数组的长度。

请注意 - 其他人说大小取决于操作系统,这是对的。这真的取决于构建。 sizeof 是一个编译时构造。

【讨论】:

    【解决方案2】:

    首先,您不应该认为“奇怪”行为的罪魁祸首是编译器:大多数情况下,错误是您的。

    事实上,您的sizeof 指令告诉您int* 的大小是多少,这是设计使然,因此这不是编译器的错,而是您的误解。无法使用sizeof 来判断动态分配数组的大小。

    【讨论】:

      【解决方案3】:

      这里的a是一个指针,指针的大小取决于编译器。

      你正在做 sizeof(int*)。 实际上,您使用的是 32 位编译器,并且您的编译器\系统指针是 32 位的。

      您无法从指针中获取使用 new 分配的对象的大小,sizeof 是在编译时评估的,而不是在运行时评估的。

      要获得数组的大小,您应该这样做...

      int a[5]; // Array allocated in stack, we can use sizeof.
      std::cout << (sizeof(a) / sizeof(int));
      

      sizeof 以字节为单位返回大小,而不是数组中元素的数量。

      那段代码相当于写

      std::cout << (sizeof(int[5]) / sizeof(int));
      

      【讨论】:

        【解决方案4】:

        sizeof 不会告诉您数组大小。它告诉您数据类型的大小,在本例中为 int*,在您的平台上为 4 个字节。无论数组元素的数量如何,它始终为 4。

        【讨论】:

        • 如果他声明char a[5]sizeof()返回一个数组大小,在这种情况下是预期的5。无论如何sizeof() 确实返回数组中的元素个数。
        【解决方案5】:

        局部变量a是指针类型(int*)。在 32 位操作系统中指针大小为 4 个字节。

        【讨论】:

          【解决方案6】:
          int* a;
          cout<<sizeof(a);
          

          相当于:

          cout<<sizeof(int*);
          

          这是可变的,取决于平台。在大多数 x32 平台上,它将是 4 个字节,在 x64 平台上是 8 个字节。

          【讨论】:

            【解决方案7】:

            你在这里的误解是

            int a* = new int[5];
            

            表示您将 a 声明为指向 int 类型数组的指针。事实并非如此。

            int a* 表示您正在声明一个指向int 的指针。

            new int[5] 表示您正在为 5 个int 类型分配内存空间。

            int a* = new int[5]; 表示您正在分配内存以存储 5 个 int 并将 int 点 a 设置为指向第一个元素。

            如果你声明了一个数组:

            int a[5];  // an array of 5 ints
            

            那么你可以:

            for (int i=0; i< (sizeof(a)/sizeof(a[0])); i++)
            {
              cout<<a[i]<<"\n"<<end1;
            }  
            
            cout<< sizeof(a)/sizeof(a[0]);
            

            【讨论】:

              【解决方案8】:

              做你想做的更简单的方法:

                  #define NumberOfInts 5
              
                  int* a = new int[NumberOFInts];
              
                  for(int i = 0; i<NumberOfInts; i++){ 
                  ....
                  }    
              

              我不确定这是否通常被认为是“好风格”,但它会修复您的代码。

              【讨论】:

                【解决方案9】:

                您只得到 指针 的大小,而不是 数组 的大小。如果将此代码编译为 64 位,则会得到另一个结果。

                我通常使用下面的代码:

                const int ARRAY_SIZE = 5;
                
                int a* = new int[ARRAY_SIZE];
                for (int i = 0; i < ARRAY_SIZE; ++i)
                {
                    // Do something.
                }
                
                // Release
                if (a)
                {
                    delete[] a;
                    a = NULL;
                }
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-08-29
                  • 1970-01-01
                  • 2015-12-22
                  • 1970-01-01
                  相关资源
                  最近更新 更多