Проблема определения размера динамического массива в C ++ - PullRequest
3 голосов
/ 06 апреля 2010

Базовый псевдокод выглядит так:

void myFunction()
{

int size = 10;

int * MyArray;

MyArray = new int[size];

cout << size << endl;

cout << sizeof(MyArray) << endl;

}

Первый Cout возвращает 10, как и ожидалось, а второй Cout возвращает 4.

У кого-нибудь есть объяснение?

Ответы [ 5 ]

8 голосов
/ 06 апреля 2010

MyArray - это только указатель, размер которого в вашей системе составляет четыре байта.

Когда вы динамически создаете массив, вам нужно следить за размером самостоятельно.

Если вы создали автоматический или статический массив,

int MyArray[10];

тогда sizeof(MyArray) будет 40. Как только массив распадется на указатель, например, например, при передаче его функции информация о размере теряется.

2 голосов
/ 06 апреля 2010

В связи с недавним вопросом.

Указатель - это указатель, независимо от того, на что он указывает на . Вы должны следить за размером самостоятельно. Лучше использовать std::vector.


sizeof возвращает размер выражения, который в данном случае равен размеру типа int*. Он всегда имеет одинаковый размер, независимо от его значения.

Для сравнения рассмотрим:

int i = 0;
i = 23434634;

Независимо от того, какое значение принимает i, размер самого i все еще равен sizeof(i) == sizeof(int). Указатель тот же, он просто содержит другой тип значения.

0 голосов
/ 06 апреля 2010
#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
0 голосов
/ 06 апреля 2010

MyArray - это int*, а sizeof(int*) в вашей системе - 4.

MyArray - это , а не массив. Это указатель, который указывает на блок памяти, в котором вы разместили массив.

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

Это должно вывести 40, то есть, насколько велико 10 int с в вашей системе. В этом случае MyArray - это массив. Таким образом, размер типа включает в себя размер всех элементов массива.

MyArray во втором случае превратится в указатель, но они по-прежнему являются двумя разными типами.

0 голосов
/ 06 апреля 2010

MyArray относится к типу int*. sizeof() при вызове переменной возвращает размер типа этой переменной.

Хотя существует особый случай для массивов, он предназначен только для стековых массивов (т.е. int MyArray[3];).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...