2012-11-16 58 views
1

如何可以宣告這樣一個陣列:靜態,堆棧和堆分配如何不同?

int array[1000000]; 

作爲一個靜態數組,一個堆疊陣列,和一個堆分配數組?

+4

這沒有任何意義......如果它在堆棧上,它也會從堆棧中彈出/彈出,並且不會滿足「靜態」要求。 – Cornstalks

+2

也許他在問如何製作一個靜態的本地?但是,這當然是微不足道的 - 語法是一樣的,你只要把它放在像其他任何本地一樣的函數中。 –

+0

他可能想知道爲什麼運行時會在發生下溢時立即進入一個函數的作用域,當靜態是* not *時,ESP會將ESP減少四/八兆字節。只是一種預感,白話讓他感到困惑。阿德姆?你是否想要這樣做,是因爲你的程序在輸入這個函數時死了,而沒有'static'出現? – WhozCraig

回答

2

你的任務似乎是在尋找這樣的:

// global variable; NOT on the stack. Exists in the data segment of the program 
int globalvar[1000000]; 

void func() 
{ 
    // local stack-variable. allocated on the stack on function entry 
    // unavailable outside this function scope. 
    int stackvar[1000000]; 

    // allocated on the heap. the only stack space used in the 
    // space occupied by the pointer variable. 
    int *heapvar = malloc(1000000 * sizeof(int)); 
    if (heapvar != NULL) 
    { 
     // use heap var 

     // free heap var 
     free(heapvar) 
    } 
} 

或許這樣的:

void func() 
{ 
    // static variable; NOT on the stack. Exists in a program data segment (usually) 
    static int staticvar[1000000]; 
     
    // local stack-variable. allocated on the stack on function entry 
    //  unavailable outside this function scope. 
    int stackvar[1000000]; 

    // allocated on the heap. the only stack space used in the 
    // space occupied by the pointer variable. 
    int *heapvar = malloc(1000000 * sizeof(int)); 
    if (heapvar != NULL) 
    { 
     // use heap var 

     // free heap var 
     free(heapvar) 
    } 
} 

對於什麼是值得的,除非你有四個或八個兆字節保留調用堆棧(或更大),上述功能可能會導致入侵。對於如此大的尺寸,通常使用堆(malloc()/free())。但那不是你的任務似乎(尚)。

+1

如果你在一個函數中創建一個數組,那麼它會自動在棧上? –

+0

@AdemHaklı當創建如上(stackvar在兩個樣本)**是** – WhozCraig

+0

好的thanks.i必須從堆中創建一個數組,這是我要問的另一個問題。我該怎麼做才能把它寫得更詳細些? –

0

函數內部的靜態聲明意味着聲明的變量在聲明的函數的執行中被共享。堆棧是內存中的一個地方,可以被任何正在運行的函數使用;當您的功能未運行時,無法保護堆棧上的某個區域不被覆蓋。靜態變量通常存儲在數據中,或者單獨存儲到程序的bss部分。如果您有嚴格的要求,必須在堆棧中的數組,你可以嘗試將其複製:

void foo(void) { 
    static int my_static_array[16]; 
    int array_copy[16]; 

    memcpy(array_copy,my_static_array,sizeof array_copy); 

    /* do funny stuff */ 

    memcpy(my_static_array,array_copy,sizeof my_static_array); 
} 
+0

堆棧部分我不明白它在哪裏? –

+0

@AdemHaklı聲明沒有任何存儲類(如靜態)的變量通常(總是?)存儲在堆棧上,因爲沒有其他方法可以將存儲分配給函數。 – fuz

0

靜態變量不能在堆棧上,這是因爲靜態的,局部變量是根本不同的,與本地變量「生活在」堆棧中,而靜態變量「靜止」在靜態段中。如果你希望局部變量對聲明局部變量的函數調用的函數可見,那麼你應該將該局部變量作爲參數傳遞。 另一個解決方案不建議是有一個指向數組的靜態指針,並指向數組中存在的數組,只要局部數組聲明的函數沒有返回,這將工作。返回後,指針會指向一個可能存在其他數據的區域,這意味着可以覆蓋返回地址或不相關的局部變量或函數參數。

0

如果您希望公開array,您可以在任何作用域之外(代碼塊之外)定義它,並且它將在二進制文本段中聲明。