【问题标题】:C++ dynamic array sizing problemC++动态数组大小问题
【发布时间】:2010-04-06 04:37:07
【问题描述】:

基本的伪代码如下所示:

void myFunction()
{

int size = 10;

int * MyArray;

MyArray = new int[size];

cout << size << endl;

cout << sizeof(MyArray) << endl;

}

第一个 cout 按预期返回 10,而第二个 cout 返回 4。

有人解释一下吗?

【问题讨论】:

    标签: c++ arrays dynamic


    【解决方案1】:

    MyArray 只是一个指针,在您的系统上,它的大小为四个字节。

    动态创建数组时,需要自己跟踪大小。

    如果您创建了自动数组或静态数组,

    int MyArray[10];
    

    然后sizeof(MyArray) 将是 40。不过,只要数组衰减为指针,例如当你将它传递给函数时,大小信息会丢失。

    【讨论】:

      【解决方案2】:

      Related to a recent question.

      指针是一个指针,不管它指向什么。您必须自己跟踪大小。更好的是使用std::vector


      sizeof 返回表达式的大小,在本例中是 int* 类型的大小。无论其值如何,它始终具有相同的大小。

      为了比较,考虑:

      int i = 0;
      i = 23434634;
      

      无论i取什么值,i本身的大小仍然只有sizeof(i) == sizeof(int)。指针是一样的,只是持有不同类型的值。

      【讨论】:

        【解决方案3】:

        MyArray 的类型为 int*sizeof() 在变量上调用时返回该变量类型的大小。

        虽然数组有一种特殊情况,但仅适用于堆栈数组(即int MyArray[3];)。

        【讨论】:

          【解决方案4】:

          MyArrayint*,而您系统上的 sizeof(int*) 是 4。

          MyArray 不是一个数组。它是一个指针,恰好指向您在其中分配了一个数组的内存块。

          int MyArray[10];
          cout << sizeof(MyArray) << endl;
          

          应该打印 40,这就是 10 ints 在您的系统上的大小。在这种情况下,MyArray 一个数组。所以类型的大小包括数组所有元素的大小。

          MyArray 在第二种情况下将衰减为指针,但它们仍然是两种不同的类型。

          【讨论】:

            【解决方案5】:
            #include <iostream>
            
            #define P(expr) std::cout << #expr << " = " << (expr) << std::endl
            
            namespace {
              void myFunction(size_t size) {
                int *pointer = new int[size]; 
                int MyArray[size];
            
                P(size);
                P(sizeof(MyArray));
                P(sizeof(pointer));
            
                delete [] pointer;    
              }
            }
            int main() {
              myFunction(10);
            }
            

            输出:

            size = 10
            sizeof(MyArray) = 40
            sizeof(pointer) = 8
            

            【讨论】:

            • 值得指出的是,您对MyArray 的定义是一个非标准扩展。
            猜你喜欢
            • 2011-09-11
            • 2011-05-03
            • 1970-01-01
            • 2011-10-24
            • 2014-02-23
            • 2014-11-15
            • 2020-11-13
            • 1970-01-01
            相关资源
            最近更新 更多