2010-04-06 57 views
3

基本伪代码如下所示:C++动态数组上浆问题

void myFunction() 
{ 

int size = 10; 

int * MyArray; 

MyArray = new int[size]; 

cout << size << endl; 

cout << sizeof(MyArray) << endl; 

} 

第一COUT返回10,如预期的,而第二COUT返回4

任何人都有一个解释?

回答

8

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

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

如果创建一个自动阵列或静态数组,

int MyArray[10]; 

然后sizeof(MyArray)将40只要阵列衰减到指针,不过,例如当你将它传递给一个函数时,尺寸信息就会丢失。

+0

完美的回应,谢谢! – Peter 2010-04-06 04:49:51

2

Related to a recent question.

指针是一个指针,无论它指向。你必须自己跟踪尺寸。最好是使用std::vector


sizeof返回表达式,在此情况下是类型int*的大小的大小。不管其价值如何,它总是具有相同的尺寸。

为了比较,考虑:

int i = 0; 
i = 23434634; 

无论i呈现什么价值,i本身规模仍只有sizeof(i) == sizeof(int)。指针是相同的,它只是拥有不同的价值。

0

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

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

0

int*,并sizeof(int*)您的系统上是4

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

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

应打印40,这是多么大的10个int小号恰好是你的系统上。在这种情况下, 的数组。所以这个类型的大小包含了数组中所有元素的大小。

在这第二种情况下会衰减成指针,但它们仍然是两种截然不同的类型。

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 
+1

其值得指出的是你对MyArray的定义是一个非标准扩展。 – 2010-04-06 05:01:39