C ++动态数组大小调整问题

时间:2010-04-06 04:37:07

标签: c++ arrays dynamic

基本伪代码如下所示:

void myFunction()
{

int size = 10;

int * MyArray;

MyArray = new int[size];

cout << size << endl;

cout << sizeof(MyArray) << endl;

}

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

有人有解释吗?

5 个答案:

答案 0 :(得分:8)

MyArray只是一个指针,在你的系统上,有四个字节的大小。

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

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

int MyArray[10];

然后sizeof(MyArray)将是40.一旦数组衰减到指针,例如,当您将其传递给函数时,大小信息将丢失。

答案 1 :(得分:2)

Related to a recent question.

指针是一个指针,无论它指向 的内容。你必须自己跟踪大小。更好的是使用std::vector


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

为了进行比较,请考虑:

int i = 0;
i = 23434634;

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

答案 2 :(得分:0)

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

虽然数组有一个特例,但它只适用于堆栈数组(即int MyArray[3];)。

答案 3 :(得分:0)

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

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

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

那应该打印40,这是你的系统上10 int的大小。在这种情况下,MyArray 一个数组。因此,类型的大小包括数组中所有元素的大小。

在第二种情况下,

MyArray将衰减为指针,但它们仍然是两种不同的类型。

答案 4 :(得分:0)

#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