C++动态数组大小问题

3
基本的伪代码如下所示:
void myFunction()
{

int size = 10;

int * MyArray;

MyArray = new int[size];

cout << size << endl;

cout << sizeof(MyArray) << endl;

}

第一个cout返回10,正如预期的那样,而第二个cout返回4。有人能解释一下吗?
5个回答

8

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

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

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

int MyArray[10];

那么sizeof(MyArray)将会是40。但是,一旦数组衰变为指针,例如当您将其传递给一个函数时,大小信息就会丢失。


2

与最近的一个问题有关。

指针是指针,不管它指向什么。你必须自己跟踪它的大小。更好的方式是使用 std::vector


sizeof 返回表达式的大小,在这种情况下是类型 int* 的大小。这个大小总是相同的,不管它的值是什么。

为了比较,请考虑:

int i = 0;
i = 23434634;

无论变量i取什么值,它本身的大小仍然只有sizeof(i) == sizeof(int)。指针也是一样的,它只是保存了不同类型的值。

0

MyArray是一个int*类型的变量,在你的系统中sizeof(int*)为4。

MyArray并不是一个数组,它只是一个指向你分配了一个数组所在内存块的指针。

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

这将打印40,这是您系统上10个int所占的空间大小。在此情况下,MyArray 一个数组。因此,类型的大小包括数组中所有元素的大小。

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


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 的定义是一个非标准扩展。 - Dennis Zickefoose

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接