A. c語言 堆棧 參數傳遞
先看一下匯編,建議王爽《匯編語言》,簡單易懂,理解一下實模式下的各個寄存器,比如cs/ip,ss/sp寄存器這些是什麼意思,基本會有感覺。
接著看《深入理解計算機系統》,裡面對堆棧有非常詳盡的分析,有了匯編基礎後,看起來會好一些。
有興趣的話建議閱讀《深入理解LINUX內核》,可以看到操作系統的整個運作過程,保護模式下的系統運作,了解用戶棧/內核棧這些概念,會感覺非常透徹。
B. 7、C語言中,形參的默認存儲類別為。 (A)auto (B) static (C)register (D)extern
C。
在函數內部或復合語句內定義變數時,如果沒有指定的存儲類型或使用了auto說明符,系統就認為所定義的變數具有自動類別。
形參即函數的自變數,其初值來源於函數的調用。只有在程序執行過程中調用了函數,形參才有可能得到具體的值,並參與運算求得函數值。形參表相當於變數說明,但應特別注意:此處只能使用類型標識符,而不能直接使用類型。
用auto(或省略)來區分說明的局部變數。當執行進入局部變數所在的塊時,在棧上為變數分配存儲,退出塊時,存儲單元被回收。具有自動存儲期的變數在進入聲明該變數的程序塊時被建立,它在該程序塊活動時存在,退出該程序塊時撤銷。在函數內部定義的變數成為局部變數。
(2)c語言中形參為堆棧擴展閱讀:
1、register關鍵字提示編譯器把局部變數或函數的形參盡可能放入CPU的寄存器中,以便快速訪問。因此變數的位元組長度不應該超過寄存器的長度。不要用取地址符(&)去獲得此變數的內存地址。例如:
{
register int Miles;
}
2、static是全局變數的默認存儲類。例如:
static int Count;
int Road;
main()
{
printf("%d ", Count);
printf("%d ", Road);
}
Count與Road兩個變數都是默認的static存儲類。
3、extern存儲類是指全局變數可以被各個對象模塊訪問。使用extern關鍵字時,表示變數已經在別處定義,所以不能在此處初始化。
網路-形式參數
網路-存儲類
C. C語言中,什麼是棧,什麼是堆
1、棧區(stack):由編譯器自動分配釋放,存放函數的參數值,局部變數等值。局部變數,任務線程函數之類的是放在(使用)棧裡面的,棧利用率高一些。其操作方式類似於數據結構中的棧。特別,棧是屬於線程的,每一個線程會有一個自己的棧。
2、堆區(heap):一般由程序員分配釋放,若程序員不釋放,則可能會引起內存泄漏。注意它和數據結構中的堆是兩回事,分配方式倒是類似於鏈表,常見的就是malloc出來的都是屬於堆區,就像固定出來的區域,到free的時候才釋放,有點類似全局的,靜態的。
(3)c語言中形參為堆棧擴展閱讀
棧內存是由編譯器自動分配與釋放的,它有兩種分配方式:靜態分配和動態分配。
1、靜態分配是由編譯器自動完成的,如局部變數的分配(即在一個函數中聲明一個int類型的變數i時,編譯器就會自動開辟一塊內存以存放變數i)。
2、動態分配由alloca函數進行分配,但是棧的動態分配與堆是不同的,它的動態分配是由編譯器進行釋放,無需任何手工實現。
D. C語言中形參,局部變數保存在寄存器或者進程的堆棧中
register 只是建議編譯器把這個局部變數放到寄存器中而不要放到棧中,但最終是否這樣做是由編譯器決定的,聲明為register的變數不一定會放到寄存器中,而沒有聲明為register的變數也有可能被放到寄存器中。
E. c語言堆棧到底是怎麼回事啊
堆棧就是先進後出的特殊數組,先進的數據放在棧底,後進的數據放在棧頂,存取數據只能在棧頂進行。好比幾本書疊起來平放桌上,最下面的書是最先放桌上的,最上面的書是最後放上去的,存取的時候只能從最上面的書取,不能從中間、也不能從最下面取。。。。
F. C語言中堆棧問題
我幫你寫了InitStack和StackEmpty函數,程序最終結果如下:
#define maxnum 20
#include<stdio.h>
#include<stdlib.h>
struct stacktype
{
int stack[maxnum];
int top;
};
struct stacktype *S;//頂一個堆棧
int push(struct stacktype *s,int x)
{
if(s->top>=maxnum-1)
return false;
else
s->top++;
s->stack[s->top]=x;
return true;
}
int pop(struct stacktype *s)
{
if(s->top <0)
return NULL;
else
s->top--;
return(s->stack[s->top+1]);
}
//初始化堆棧
void InitStack(struct stacktype* &S)
{
S = (struct stacktype *)malloc(sizeof(struct stacktype));
S->top = -1;
}
//判斷堆棧是否為空
bool StackEmpty(struct stacktype *S)
{
if (S->top <0)
{
return true;
}
return false;
}
void dec_to_bin(int n,int b)
{
int e;
InitStack(S);//請問初始化堆棧函數怎麼寫?
if (S ==NULL)
{
printf("error \n");
return;
}
while(n)
{
push(S,n%b);
n=n/b;
}
while(!StackEmpty(S))//判斷棧為空的函數怎麼寫?
{
e=pop(S);
printf("%d",e);
}
}
void main()
{
dec_to_bin(13,2);
printf("\n");
}
程序運行結果為:
1101
G. c語言中的棧是指什麼啊
是一種數據結構.這種結構的存取原則相當於取放盤子的過程,放的時候將盤子一個一個堆起來放,取的時候先取原先最後放入的一個,然後依次類推.即後進先出的原則.
棧有順序(數組等)和鏈式(鏈表)兩種存儲結構,它的邏輯結構實質是線性表中的一種,只是這種線性表只允許在其中一端進行存取操作.更為詳細的解釋請參考數據結構一書!
H. C語言堆棧問題,數組作為函數參數到底是佔用堆空間還是棧空間啊
你這個函數只傳了一個數組的地址,說白了就是一個unsigned long int數,就一個這樣的數你覺得用得著去動用棧棧傳參嗎?X86隨便一個寄存器都能裝得下,一般AX,BX,CX,DX這幾個寄存器對於這種傳幾個字長的參數夠夠的了,只有在寄存器不夠的情況下,參數過多,或參數過大(結構體)才用得著堆棧傳參。另外提醒一下:你這個N是傳不進來的,編譯器只是根據[ ]這個符號來認定array是一個地址,N只能另外做為一個int N 的參數傳進來。