回答
你的任務似乎是在尋找這樣的:
// 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()
)。但那不是你的任務似乎(尚)。
如果你在一個函數中創建一個數組,那麼它會自動在棧上? –
@AdemHaklı當創建如上(stackvar在兩個樣本)**是** – WhozCraig
好的thanks.i必須從堆中創建一個數組,這是我要問的另一個問題。我該怎麼做才能把它寫得更詳細些? –
函數內部的靜態聲明意味着聲明的變量在聲明的函數的執行中被共享。堆棧是內存中的一個地方,可以被任何正在運行的函數使用;當您的功能未運行時,無法保護堆棧上的某個區域不被覆蓋。靜態變量通常存儲在數據中,或者單獨存儲到程序的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);
}
堆棧部分我不明白它在哪裏? –
@AdemHaklı聲明沒有任何存儲類(如靜態)的變量通常(總是?)存儲在堆棧上,因爲沒有其他方法可以將存儲分配給函數。 – fuz
靜態變量不能在堆棧上,這是因爲靜態的,局部變量是根本不同的,與本地變量「生活在」堆棧中,而靜態變量「靜止」在靜態段中。如果你希望局部變量對聲明局部變量的函數調用的函數可見,那麼你應該將該局部變量作爲參數傳遞。 另一個解決方案不建議是有一個指向數組的靜態指針,並指向數組中存在的數組,只要局部數組聲明的函數沒有返回,這將工作。返回後,指針會指向一個可能存在其他數據的區域,這意味着可以覆蓋返回地址或不相關的局部變量或函數參數。
如果您希望公開array
,您可以在任何作用域之外(代碼塊之外)定義它,並且它將在二進制文本段中聲明。
- 1. 靜態,堆棧和堆內存分配的地址排序?
- 2. 內存分配,堆棧和堆棧
- 3. 堆棧或堆棧分配不正確
- 4. 動態堆棧分配
- 5. 動態分配stdlib堆棧?
- 6. C++堆棧與堆分配
- 7. Java堆和堆棧內存分配
- 8. 堆陣列分配而不是堆棧
- 9. PIMPL和堆棧分配
- 10. 爲什麼不能將靜態類變量分配給堆棧?
- 11. C堆棧分配
- 12. 靜態與非靜態堆棧
- 13. 堆棧溢出和靜態數組
- 14. 受保護的堆對象堆棧vs堆棧分配
- 15. C++是堆棧還是堆分配?
- 16. 堆/堆棧上的類成員分配?
- 17. 堆棧或堆上的對象分配
- 18. 堆VS數據段VS堆棧分配
- 19. 從堆分配時堆棧溢出
- 20. 檢測堆棧或堆分配
- 21. 對象分配在堆棧或堆C++
- 22. C++中的動態堆棧分配
- 23. 動態堆棧內存重新分配
- 24. Python是否有靜態對象,堆棧對象和堆對象?
- 25. 爲堆棧上的靜態變量分配空間
- 26. JVM - 堆棧和堆棧
- 27. 分配在堆或棧上?
- 28. 分配struct堆棧:Pthread_create
- 29. 線程堆棧分配
- 30. C中的堆棧分配
這沒有任何意義......如果它在堆棧上,它也會從堆棧中彈出/彈出,並且不會滿足「靜態」要求。 – Cornstalks
也許他在問如何製作一個靜態的本地?但是,這當然是微不足道的 - 語法是一樣的,你只要把它放在像其他任何本地一樣的函數中。 –
他可能想知道爲什麼運行時會在發生下溢時立即進入一個函數的作用域,當靜態是* not *時,ESP會將ESP減少四/八兆字節。只是一種預感,白話讓他感到困惑。阿德姆?你是否想要這樣做,是因爲你的程序在輸入這個函數時死了,而沒有'static'出現? – WhozCraig