【发布时间】: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。
有人解释一下吗?
【问题讨论】:
基本的伪代码如下所示:
void myFunction()
{
int size = 10;
int * MyArray;
MyArray = new int[size];
cout << size << endl;
cout << sizeof(MyArray) << endl;
}
第一个 cout 按预期返回 10,而第二个 cout 返回 4。
有人解释一下吗?
【问题讨论】:
MyArray 只是一个指针,在您的系统上,它的大小为四个字节。
动态创建数组时,需要自己跟踪大小。
如果您创建了自动数组或静态数组,
int MyArray[10];
然后sizeof(MyArray) 将是 40。不过,只要数组衰减为指针,例如当你将它传递给函数时,大小信息会丢失。
【讨论】:
指针是一个指针,不管它指向什么在。您必须自己跟踪大小。更好的是使用std::vector。
sizeof 返回表达式的大小,在本例中是 int* 类型的大小。无论其值如何,它始终具有相同的大小。
为了比较,考虑:
int i = 0;
i = 23434634;
无论i取什么值,i本身的大小仍然只有sizeof(i) == sizeof(int)。指针是一样的,只是持有不同类型的值。
【讨论】:
MyArray 的类型为 int*。 sizeof() 在变量上调用时返回该变量类型的大小。
虽然数组有一种特殊情况,但仅适用于堆栈数组(即int MyArray[3];)。
【讨论】:
MyArray 是 int*,而您系统上的 sizeof(int*) 是 4。
MyArray 不是一个数组。它是一个指针,恰好指向您在其中分配了一个数组的内存块。
int MyArray[10];
cout << sizeof(MyArray) << endl;
应该打印 40,这就是 10 ints 在您的系统上的大小。在这种情况下,MyArray 是一个数组。所以类型的大小包括数组所有元素的大小。
MyArray 在第二种情况下将衰减为指针,但它们仍然是两种不同的类型。
【讨论】:
#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 的定义是一个非标准扩展。