基本伪代码如下所示:
void myFunction()
{
int size = 10;
int * MyArray;
MyArray = new int[size];
cout << size << endl;
cout << sizeof(MyArray) << endl;
}
第一个cout按预期返回10,而第二个cout返回4。
有人有解释吗?
答案 0 :(得分:8)
MyArray
只是一个指针,在你的系统上,有四个字节的大小。
当您动态创建数组时,您需要自己跟踪大小。
如果您创建了自动数组或静态数组,
int MyArray[10];
然后sizeof(MyArray)
将是40.一旦数组衰减到指针,例如,当您将其传递给函数时,大小信息将丢失。
答案 1 :(得分:2)
指针是一个指针,无论它指向 的内容。你必须自己跟踪大小。更好的是使用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)
MyArray
是int*
,您系统上的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