Сомнение в размерах - PullRequest
       5

Сомнение в размерах

2 голосов
/ 11 августа 2011

Я пытался что-то сделать, используя оператор sizeof в c ++.
Пожалуйста, обратитесь к следующему фрагменту кода.
http://ideone.com//HgGYB

#include <iostream>
using namespace std;
int main()
{
    int *pint = new int[5];
    int temp = sizeof(*pint);
    cout << "Size of the int array is " << temp << endl;
    return 0;
}

Я ожидал, что результат будет 5 * 4 = 20. Удивительно, но доходит до 4. Есть идеи?

Ответы [ 7 ]

6 голосов
/ 11 августа 2011

Здесь pint является int*. Таким образом,

sizeof(*pint) == sizeof(int)

Компилятор не знает о new int[5], когда он sizeof(*pint) (потому что sizeof() является оператором времени компиляции ).

[Примечание. Попробуйте выполнить тот же тест со статически объявленным массивом, int pint[5];, и увидите ожидаемый результат. Кроме того, sizeof() возвращает size_t (что является значением без знака), поэтому оно должно быть:

size_t temp = sizeof(...);

]

1 голос
/ 11 августа 2011

C ++ не может узнать размер массива. В вашем случае

*pint

возвращает целое число, а sizeof (int) равно 4 на вашей машине.

1 голос
/ 11 августа 2011

Массивы динамического размера теряют информацию о размере - размер равен размеру целого числа, так как pint - указатель на int, а *pint - целое число, а не тип массива любого размера.

0 голосов
/ 10 октября 2012

В текущем случае sizeof (* пинта) дает sizeof (int), поэтому его возвращаемое значение 4.Но, даже если вы попробуете sizeof (pint), он вернет вам размер указателя.Который, скорее всего, будет равен 4, если у вас 32-битная машина, иначе будет 8, если 64-битная машина.

Теперь вы спросили, почему он не возвращает 4 * 5 = 20. Поскольку пинта указывает нацелочисленный массив.Да, пинта указывает на массив целых чисел, но это не массив.Разница:

  1. Массив имеет фиксированный размер.Вы можете переопределить это вообще.Хотя указатели могут указывать на любой объект любого размера.

Поскольку оператор sizeof вычисляется во время компиляции, компилятор не может узнать, на какой размер массива указывает этот указатель, и поэтому не может сказать,размер этого объекта и поэтому он всегда возвращает только размер указателя.Теперь вы можете понять, почему в случае указателей компилятор дает размер указателя (т. е. пространство, занимаемое указателем в памяти), а в случае массива - полный размер.

0 голосов
/ 11 августа 2011

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

0 голосов
/ 11 августа 2011

pint - это указатель на int, который просто указывает на начало массива. Он не содержит информации об этом массиве.

0 голосов
/ 11 августа 2011

все хорошо.Вы запрашиваете размер int, который будет 4 байта.

...