2015-11-04 97 views
-2

我需要聲明一個變量,是不是在棧內存,但在人堆裏,像下面全局聲明是堆棧還是堆?

struct mystruct *name; 

我應該聲明它之外的所有功能(即使外面的main())在開始的文件?

+1

他們嗎?變量在堆? hmmmm –

+1

C沒有指定實現細節。 – Olaf

+0

@SouravGhosh:您可以使用基於堆的方法而不是堆棧。 – Olaf

回答

1

請注意,一個變量是從未申報「上堆」。只讀存儲器所指向的指針可以是上(從)堆中分配

在你的榜樣,你可以聲明name確實之外的任何功能,那麼它會在全球內存中。您也可以delcare函數內部變量,由關鍵字static之前。後者將在全局內存中分配變量,但它只會在您聲明它的函數中可見。

要使用指針變量,您現在必須爲它指定內存以指向您使用malloc在堆上分配的內存。

0

TL; DR版

你不能聲明一個變量,使得變量本身住在堆。

詹姆斯·米切納版本

C語言定義不談論堆棧或堆;它談論存儲持續時間

對象與auto存儲持續時間(塊中的static關鍵字中,沒有聲明任何東西)具有從該塊和結束的開始延伸壽命當塊退出:

void foo(void) 
{ 
    int a = 0;      // lifetime of a extends to the end of 
            // the function 
    for (int i = 0; i < 10; i++) // lifetime of i and b extend to the end 
    {         // of the for loop 
    int b = a + i;  
    printf("b = %d\n", b);  
    } 
} 

大多數實現分配存儲用於從硬件堆棧auto對象,因爲堆疊使得該行爲易於實現。

對象與static存儲持續時間(任何一個功能的static關鍵字外或聲明)具有從程序被加載到存儲器中的時間延長的壽命,直至程序退出:

int a = 0;     // lifetime of a extends over the lifetime of 
          // the entire program 
int main(void) 
{ 
    static int b = 10;   // lifetime of b also extends over the lifetime 
          // of the program, but is only visible within 
          // main 
    ... 
} 

大多數實現爲可執行文件本體內的static對象留出存儲空間(對於使用ELF格式的可執行文件,此類對象將存儲在圖像的.bss,.data.rodata部分)。

對象與allocated存儲持續時間有從他們被分配,直到它們被明確地給free呼叫釋放時間延長壽命(任何與malloccalloc,或者realloc分配)。

int *foo(size_t size) 
{ 
    int *ptr = malloc(sizeof *ptr * size); 
    return ptr;        
} 

void bar(void) 
{ 
    int *p = foo(10);      
    // do something with p 
    free(p); 
} 

變量ptrp只存在的各自的功能的壽命,並且它們會從堆棧中通常被分配。這兩個變量對象從直到它與free釋放它與malloc分配的時間存在。

大多數實現用於從堆allocated對象分配存儲空間。

確實沒有辦法讓你聲明一個對象具有allocated存儲期限;您可以通過malloccallocrealloc創建此對象的唯一方法。無論您聲明用於存儲由這些函數返回的指針值的對象將具有autostatic存儲持續時間。


1.在實踐中,對於所有的局部對象存儲在函數入口被分配,並在函數出口釋放,而不管對象的生命週期是否在整個功能或限於函數內的一個塊。但是,您永遠不應該依賴於在該對象的生命週期之外訪問的存儲。例如,ib的生存期限於for循環;即使每個存儲的存儲空間都可能已在函數入口處分配,您也不應嘗試在循環體外訪問該存儲。畢竟,C被設計在一臺帶有堆棧的機器上。