Да предположим, че имам масив с размер 78719476736 байта. имайте предвид, че този масив е динамично разпределен с помощта на malloc в моя C код. Да приемем, че malloc връща валиден указател след разпределяне на толкова много памет. Размерът на този масив е повече от UINT_MAX(4294967295), т.е. максималното ограничение на unsigned int(32 бита)
Да приемем, че кодът ми изглежда като нещо по-долу, напр.
int *buf;
buf = (int*)malloc(78719476736);
Тук 78719476736 е по-голямо от 4 * UINT_MAX.
Сега, ако трябва да се позова на всички елементи на buf, тогава, тъй като buf е int*, той ще бъде 32 бита, така че няма да може да адресира всички елементи на паметта, които съм разпределил с помощта на malloc(78719476736 байта).
Въпросът ми е не трябва ли кодът по-горе да бъде променен, за да направи buf толкова дълъг (64-битова променлива), тъй като само дълга дълга променлива ще може да адресира голямата памет, която съм разпределил.
Променен код напр.
unsigned long long int buf;
buf = (unsigned long long int*)malloc(78719476736);
Всъщност мисля, че променливата buf вече не трябва да бъде указател, тъй като всеки указател ще бъде 32-битов широк и следователно няма да има достъп до 78719476736 байта.
Така че трябва да е обикновен unsigned long long int и ще трябва да прехвърля стойността на указателя за връщане на malloc към unsigned long long int, както е показано в променения код по-горе, и да използвам buf за достъп до всички разпределени елементи.
Прав ли съм в предположенията си по-горе?
or
Бъркам/пропускам ли нещо?
РЕДАКТИРАНЕ: Ако помага,
Работя на настолен компютър с WinXP на Intel Core 2 Duo (64-битов процесор). Така че по отношение на процесора не би трябвало да има проблем с достъпа до повече от 4 GB адресно пространство. Кои други компоненти трябва да бъдат активирани за 64-битова поддръжка, т.е.
а.) Как да активирам поддръжка на компилатор за 64 бита, докато компилирам (използвам Visual Studio 2005 Professional edition)
b.) Поддръжка на ОС за 64 бита - използвам Windows XP Professional.
Благодаря ти.
-AD.