Truck53 Ответов: 4

Sizeof оператор возвращает неправильное значение


Why is my sizeof operator returning the value 8 when it should be returning the value 40. My array is of type double therefore, to my understanding, each element of the array should be 8bytes. And, with 5 elements in my array, the sizeof operator should be returning 40bytes in total. However, when I check the value returned from the entire array, I only get 8 bytes which is the value of only a single element. I forced the array length in my code below to 5 to ensure that my array did infact have all five elements, and it did. I am baffled. Why are there five elements in my array but, only 8 bytes being returned by my sizeof operator. My code is below:

#include<iostream>

using std::cout;
using std::cin;
using std::endl;

int main()
{
	int exit = 1;
	int count = 1;
	int arrayValueLength = 5;
	double *arrayValue;

	arrayValue = new double[5];

	while(exit != 0)
	{
		cout << "Enter any number: ";
		cin >> arrayValue[count-1];
		cout << endl;
		cout << arrayValue[count-1] << endl;
		if(count == 5 )
		{
			exit = 0;
		}

		++count;
	}
	cout << "You entered the following values: " << endl;
	int value1 = sizeof(arrayValue);     //only returning 8bytes
	int value2 = sizeof(arrayValue[0]);  //returning 8bytes for single element
	int value3 = sizeof(double);         //checked size of doulbe and it is 8bytes
	cout << "value1 equals: " << value1 << endl;
	cout << "value2 equals: " << value2 << endl;
	cout << "value3 equals: " << value3 << endl;
	cout << "arrayValueLength equals: " << arrayValueLength << endl;

	for(int i = 0; i < arrayValueLength; i++)
	{
		cout << arrayValue[i] << " ";
	}
	cout << endl;
	return 0;
}


Что я уже пробовал:

Я не знаю, что еще можно попробовать. Каждый ресурс, который я проверил, говорит, что мое значение sizeof должно возвращать правильное значение.

Truck53

Нужно ли вручную кодировать размер массива при использовании динамического массива? Я предполагаю, что также невозможно использовать цикл на основе диапазона для динамического массива. Я пытался, но получил ошибку компилятора.

С. П.

Спасибо за все ответы.

4 Ответов

Рейтинг:
20

Patrice T

double *arrayValue;

arrayValue это указатель на двойника, sizeof понятия не имею, что это массив, и понятия не имею о его длине.


CPallini

5.

Patrice T

Спасибо

Рейтинг:
2

CPallini

sizeof это правильно, конечно.
Смотрите, например: Не применяйте оператор sizeof к указателю при определении размера массива[^].


Рейтинг:
2

KarstenK

Ответ прост и ясен: в результате вы получаете размер указателя.

double *arrayValue;
sizeof(arrayValue);

Чтобы получить размер памяти массива, вы должны получить размер типа элемента (или одного элемента) и умножить его количество. Например:
double array[40];
int arrSize1 = sizeof(double) * 40;
int arrSize2 = sizeof(array[0]) * 40;


Рейтинг:
1

Jochen Arndt

Это потому что arrayValue это указатель на выделенную память, и такие указатели всегда имеют одинаковый размер независимо от типа данных, хранящихся в массиве (4 байта для 32-битных процессов и 8 байт для 64-битных процессов).

sizeof() вернет только общий размер для нединамических массивов:

double statArr[5];
double *dynArr = new double[5];
size_t statSize = sizeof(statArr); // 5 * sizeof(double): 40
size_t dynSize = sizeof(dynArr); // sizeof(double*): 8 (or 4 on 32-bit systems)