基本伪代码如下所示:C++动态数组上浆问题
void myFunction()
{
int size = 10;
int * MyArray;
MyArray = new int[size];
cout << size << endl;
cout << sizeof(MyArray) << endl;
}
第一COUT返回10,如预期的,而第二COUT返回4
任何人都有一个解释?
基本伪代码如下所示:C++动态数组上浆问题
void myFunction()
{
int size = 10;
int * MyArray;
MyArray = new int[size];
cout << size << endl;
cout << sizeof(MyArray) << endl;
}
第一COUT返回10,如预期的,而第二COUT返回4
任何人都有一个解释?
只是一个指针,它在您的系统上具有四个字节的大小。
当您动态创建数组时,您需要自己跟踪大小。
如果创建一个自动阵列或静态数组,
int MyArray[10];
然后sizeof(MyArray)
将40只要阵列衰减到指针,不过,例如当你将它传递给一个函数时,尺寸信息就会丢失。
指针是一个指针,无论它指向在。你必须自己跟踪尺寸。最好是使用std::vector
。
sizeof
返回表达式,在此情况下是类型int*
的大小的大小。不管其价值如何,它总是具有相同的尺寸。
为了比较,考虑:
int i = 0;
i = 23434634;
无论i
呈现什么价值,i
本身规模仍只有sizeof(i) == sizeof(int)
。指针是相同的,它只是拥有不同的价值。
的类型为int*
。 sizeof()
在变量上调用时返回该变量类型的大小。
虽然数组有特殊情况,但它仅适用于堆栈数组(即int MyArray[3];
)。
是int*
,并sizeof(int*)
您的系统上是4
是不数组。它是一个指向恰好指向分配数组的内存块的指针。
int MyArray[10];
cout << sizeof(MyArray) << endl;
应打印40,这是多么大的10个int
小号恰好是你的系统上。在这种情况下, 是的数组。所以这个类型的大小包含了数组中所有元素的大小。
在这第二种情况下会衰减成指针,但它们仍然是两种截然不同的类型。
#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的定义是一个非标准扩展。 – 2010-04-06 05:01:39
完美的回应,谢谢! – Peter 2010-04-06 04:49:51