2013-12-12 73 views
0
static const int MAX_SIZE = 256; //I assume this is static Data 

bool initialiseArray(int* arrayParam, int sizeParam) //where does this lie? 
{ 
if(size > MAX_SIZE) 
{ 
return false; 
} 

for(int i=0; i<sizeParam; i++) 
{ 
arrayParam[i] = 9; 
} 

return true; 
} 

void main() 
{ 
int* myArray = new int[30]; //I assume this is allocated on heap memory 
bool res = initialiseArray(myArray, 30); //Where does this lie? 
delete myArray; 
} 

目前,我們正在學習不同類別的記憶,我知道那裏有 -Code內存 - 靜態數據 - 運行時棧 - 免費商店(堆)不同類別的內存

我評論過我不確定的地方,只是想知道有沒有人能幫助我。我對運行時棧的定義描述了這是用於函數,但是我的代碼存儲器定義它包含所有方法/函數的指令,所以我只是有點困惑。

任何人都可以伸出援手嗎?

回答

1
static const int MAX_SIZE = 256; //I assume this is static Data 

是的。實際上,因爲它是const,所以這個值可能不會保存在最終的可執行文件中,因爲編譯器只能在看到MAX_SIZE的任何地方替換「256」。

bool initialiseArray(int* arrayParam, int sizeParam) //where does this lie? 

initialiseArray()函數的代碼將在你exectuable的數據部分。你可以得到一個指向內存地址的指針,並通過該地址調用該函數,但除此之外,沒有其他可以使用的地方。

arrayParamsizeParam參數將通過值傳遞給堆棧上的函數。同樣,bool返回值將被放入調用函數的堆棧區域。

int* myArray = new int[30]; //I assume this is allocated on heap memory 

正確。

bool res = initialiseArray(myArray, 30); //Where does this lie? 

有效地,myArray指針和文字30被複制到的initialiseArray()棧區域,然後操作它們,然後將所得bool被複制到調用函數的堆棧區域。

參數傳遞的實際細節更加灰暗,並且依賴於調用約定(其中有幾個,特別是在Windows上),但除非您正在做一些非常專業的事情,否則它們並不重要: )

+0

感謝您的詳細回覆Tristan,讓事情變得更加清晰:) – user2757842

1

該堆棧用於自動變量 - 即在函數中聲明的變量或函數參數。這些變量被破壞時,程序自動離開,他們在被宣佈的代碼塊

你是正確的,MAX_SIZE靜態一生 - 它在程序結束時自動銷燬。分配new[]的陣列在堆上(具有動態生命週期)也是正確的 - 它不會被自動銷燬,因此需要刪除。順便說一下,您需要delete [] myArray;以匹配使用new []

的指向它的指針(myArray)是一個自動可變的,在堆棧上,因爲是res和函數參數。

+0

感謝您的迴應Mike,您自己和Tristan幫了我很多錢 – user2757842

0

只有一種類型的內存......它是一個內存:D 不同之處在於它在哪裏以及如何訪問它。

如果你深入瞭解Windows中的exe加載器(或者實際上任何類型的操作系統),它真正做的是存儲你的部分的信息(部分你的exe),並且在運行時放置它正確進入內存並應用訪問權限。所以一般來說,你的「程序」與你的數據部分是相同的內存(你的RAM)的代碼部分。不同之處在於訪問權限不同,代碼段通常只讀+執行數據,只讀+寫(而不執行)。

堆棧仍然是一個內存,它的意義在於它再次由操作系統控制,堆棧大小是堆棧大小的大小(以字節爲單位),但這裏的目的是保存即時值在函數調用之間(根據stdcall)和局部變量(取決於編譯器它是如何完成的),因爲它是一個你可以使用的內存,但是和你一樣,可以讓它在堆棧上分配一個10000字節的字符串。在彙編中你可以直接訪問,因爲有一個堆棧指針EBP(如果我沒記錯的話),或者在C/C++中,你可以使用alloca。

新的和刪除操作符爲C++語言內置,但據我所知他們使用相同的系統分配器,事實上,你可以覆蓋它們並使用malloc/free,它應該工作,這意味着這也是同樣的記憶。

使用new/delete和os特定函數的區別在於你讓語言處理分配,但最終你會得到一個指針,就像使用其他函數一樣。

除此之外,還有一些特殊的方法,但是這些改變了內存處理的方式,在Windows中這是虛擬內存,比如VirutalAlloc,VirutalFree將允許你指定你想要使用的內存因此你可以讓操作系統更好地優化,就像你告訴它我想2Gb的內存一樣,但它不一定要在RAM中,所以它可以將它保存在磁盤上,但你仍然可以通過內存指針訪問它。

而關於你的問題:

static const int MAX_SIZE = 256; //I assume this is static Data 

這通常取決於編譯器,但他們大多將其視爲常量(靜態別的東西),這意味着,這將是在exe文件的常量部分,其這意味着這個內存塊將是隻讀的。

int* myArray = new int[30]; //I assume this is allocated on heap memory 

是的,這將是在堆上,但它是如何分配依賴於實現,只要你重寫新的運營商,如果你這樣做,你可以例如迫使它在虛擬內存中,因此實際上它可能在磁盤或內存中,但這樣做是愚蠢的事情,是的,它會在堆上。

bool res = initialiseArray(myArray, 30); //Where does this lie? 

多的事情在這裏發生,因爲編譯器知道initialiseArray的第一個參數必須是一個指向一個int它會通過一個指針MYARRAY所以無論指針和30的值會在堆棧上然後調用該函數。 在它運行的內存(代碼段)中的函數中,從堆棧中獲取參數(int * arrayParam,int sizeParam),它會知道要寫入arrayParam,並且它是指針,所以它會寫入arrayParam指向的位置。到你指定它與arrayParam [i] <我會將內存指針偏移到正確的值,再次C++通過調整指針爲你做一些魔術,因爲代碼中的調整應該以字節爲單位,它會移動內存指針4因爲(通常)int == 4個字節。使用調試器或反彙編器(如OllyDbg)並親自查看它,如果您想了解更多關於如何使用堆棧的信息,請查看stdcall調用慣例。

+0

您不能使用新的malloc和o/s通話。 –

+0

解釋會很好:)噢,你可能是說我不能像malloc和HeapFree那樣交換操作系統,例如,是的,我忘了提及,因爲我認爲它很明顯:D – DrakkLord