c語言棧地址
Ⅰ c語言棧的初始值存在哪裡
棧底是第一個進棧的數據所處的位置,棧頂是最後一個進棧的數據所在位置。
C語言初始化——棧的初始化 棧是一種具有後進先出性質的數據組織方式,也就是說後存放的先取出,先存放的後取出。
Ⅱ C語言棧是什麼,棧在哪,需要定義嗎
棧有兩種
一種是操作系統中的
進程棧
或者線程棧
系統自動生成
不需要定義
一種是數據結構中的
需要自己實現。
Ⅲ C語言中的棧、堆是什麼
C語言中的堆和棧都是一種數據項按序排列的數據結構。
棧就像裝數據的桶或箱子
我們先從大家比較熟悉的棧說起吧,它是一種具有後進先出性質的數據結構,也就是說後存放的先取,先存放的後取。
這就如同我們要取出放在箱子裡面底下的東西(放入的比較早的物體),我們首先要移開壓在它上面的物體(放入的比較晚的物體)。
堆像一棵倒過來的樹
而堆就不同了,堆是一種經過排序的樹形數據結構,每個結點都有一個值。
通常我們所說的堆的數據結構,是指二叉堆。堆的特點是根結點的值最小(或最大),且根結點的兩個子樹也是一個堆。
由於堆的這個特性,常用來實現優先隊列,堆的存取是隨意,這就如同我們在圖書館的書架上取書。
雖然書的擺放是有順序的,但是我們想取任意一本時不必像棧一樣,先取出前面所有的書,書架這種機制不同於箱子,我們可以直接取出我們想要的書。
(3)c語言棧地址擴展閱讀:
關於堆和棧區別的比喻
使用棧就象我們去飯館里吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等准備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。
使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。
參考資料來源:網路-堆棧
Ⅳ c語言每個函數都有一個棧區對嗎,函數的入口地址與棧區地址是一回事嗎
這個內存用來保存局部變數的, 一般叫做棧區,在編譯原理 上叫做棧幀。比如下面的代碼
int main()
{
int a = 2; //這個變數a就在main函數的內存中,就是main函數的棧區中。。
return 0;
}
而且棧區是棧區,是一個數據存儲區,並不是main函數的代碼區域 。。剛回答了這個問題。
Ⅳ c語言中,棧是具體應用方法和步驟
棧簡單的講就是一片存儲區域(存儲區的首地址即為棧頂)
你可以向棧中存入數據取出數據刪除數據
/*
Note:Your
choice
is
C
IDE
*/
#include
"stdio.h"
#define
m
100
struct
Mystack/*定義棧結構*/
{
char
element[m];
int
top;/*棧頂*/
};
void
push(struct
Mystack
*s,char
x)
/*將x的值壓入棧頂*/
{
/*
s->element[s->top]=x;
s->top++;*/
s->element[s->top]=x;
s->top++;
}
void
pop(struct
Mystack
*s)
/*將棧頂元素刪除*/
{
s->top--;
}
int
IsEmpty(struct
Mystack
*s)
/*判斷棧是否為空*/
{
if(s->top==0)
return
1;
else
return
0;
}
void
Clearstack(struct
Mystack
*s)
/*清空棧元素*/
{
s->top=0;
}
void
Displaystack(struct
Mystack
*s)
/*輸出棧元素*/
{
int
i;
for(i=0;i
top;i++)
printf("%c",s->element[i]);
}
main()
{
struct
Mystack
st;
int
i;
char
ch;
for(i=0;i<100;i++)
st.element[i]='\0';
st.top=0;
printf("please
write
a
string:\n");
ch=getchar();
while(ch!='\n')
{
switch(ch)
{
case
'#':
if(!IsEmpty(&st))
pop(&st);
break;
case
'@':
if(!IsEmpty(&st))
Clearstack(&st);
break;
default:
push(&st,ch);
}
ch=getchar();
}
printf("the
string
is
:\n");
Displaystack(&st);
}
Ⅵ C語言,如何將一組地址存儲在棧中
所謂棧,在編譯原理中叫做棧幀 ,實際上是一段虛擬內存空間。
在C語言中函數內部的局部變數即為棧區變數。因此,只需要在建立局部指針數組,即可存儲地址到棧空間中。
int main()
{
int *ptr[100]; //可以存儲100個地址的棧區指針數組。
}
Ⅶ C語言中堆和棧的區別
(1)申請方式
stack:
由系統自動分配。例如,聲明在函數中一個局部變數 int a; 系統自動在棧中為a開辟空間
heap:
需要程序員自己申請,並指明大小,在c中malloc函數
如m1 = (char *)malloc(10);
在C++中用new運算符
如m2 = (char *)malloc(10);
注意:m1、m2本身是在棧中的。
(2)申請後系統的響應
棧:只要棧的剩餘空間大於所申請空間,系統將為程序提供內存,否則將報異常提示棧溢出。
堆: 首先應該知道操作系統有一個記錄空閑內存地址的鏈表,當系統收到程序的申請時,會遍歷該鏈表,尋找第一個空間大於所申請空間的堆結點,然後將該結點從空閑 結點鏈表中刪除,並將該結點的空間分配給程序,另外,對於大多數系統,會在這塊內存空間中的首地址處記錄本次分配的大小,這樣,代碼中的delete語句才能正確的釋放本內存空間。另外,由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部分重新放入空閑鏈表中。
(3)申請大小的限制及生長方向
棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也可能是1M,它是一個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小 。
堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由於系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。
(4)申請效率的比較:
棧由系統自動分配,速度較快。但程序員是無法控制的。
堆是由new分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便.
另外,在WINDOWS下,最好的方式是用VirtualAlloc分配內存,他不是在堆,也不是在棧是直接在進程的地址空間中保留一快內存,雖然用起來最不方便。但是速度快,也最靈活。
(5)堆和棧中的存儲內容
棧:在函數調用時,第一個進棧的是主函數中後的下一條指令(函數調用語句的下一條可執行語句)的地址,然後是函數的各個參數,在大多數的C編譯器中,參數是由右往左入棧的,然後是函數中的局部變數。注意靜態變數是不入棧的。
當本次函數調用結束後,局部變數先出棧,然後是參數,最後棧頂指針指向最開始存的地址,也就是主函數中的下一條指令,程序由該點繼續運行。
堆:一般是在堆的頭部用一個位元組存放堆的大小。堆中的具體內容有程序員安排。
Ⅷ 棧的基本操作的實現(c語言),高手速來!!
/*程序錯誤太多*/ #include"stdio.h"
#include"stdlib.h"
#include"time.h"
#include"malloc.h"
#define
STACK_INIT_SIZE
10
//棧容量 typedef
struct
SqStack
{
int
top;
//棧頂當前指針
int
*base;
//棧空間數組
}SqStack; void
InitStack(SqStack
&S);
//構造空棧S
int
Push(SqStack
&S,int
e);
//入棧(棧地址,入棧數據)
返回0對,-1錯
int
Pop(SqStack
&S);
//出棧
(棧地址)返回棧頂數據
int
StackLength(SqStack
S);
//返回站的元素個數,即求棧長
void
Print_S(SqStack
S);
//顯示棧內數據 int
main()
{
SqStack
S;
int
i=0;
int
a,e;
InitStack(S);
srand((unsigned)time(NULL));
//srand((unsigned)time(NULL))以time函數值(當前時間)作為種子
printf("隨機填充5個元素為:
");
while(
i<5)
{
a
=
rand()%100;
printf("%d
",
a);
Push(S,a);
i++;
}
Print_S(S);
printf("請輸入要插入棧頂的元素:");
scanf("%d",&e);
Push(S,e);
Print_S(S);
printf("再彈出的棧頂元素為:%d
\n",Pop(S));
printf("棧的長度為:%d
\n",StackLength(S));
Print_S(S);
return
0;
} void
InitStack(SqStack
&S)
//構造空棧S
{
S.base
=
(int
*)malloc(STACK_INIT_SIZE
*
sizeof(int));
//分配組數空間,長度STACK_INIT_SIZE
if
(S.base==NULL)
{
printf("內存分配失敗!\n");
return;
}
S.top=-1;
} int
Push(SqStack
&S,int
e)
{
if(S.top>=STACK_INIT_SIZE)
{
printf("棧空間已滿,入棧失敗!\n");
return
-1;
}
else
{
S.base[++S.top]=e;
return
0;
}
} int
Pop(SqStack
&S)
//返回棧頂數據
{
if
(S.top>=0)
//棧內有數據
{
return
S.base[S.top--];
}
else
{
printf("空棧,無數據彈出!\n");
return
-1;
}
} int
StackLength(SqStack
S)
{
return
S.top+1;
} void
Print_S(SqStack
S)
{
printf("\n出棧顯示:");
if(S.top
==
-1)
printf("棧內無數據!\n");
else
{
while(S.top>=0
)
printf("%d
",Pop(S));
putchar('\n');
}
}
Ⅸ c語言之棧地址范圍:
1、每個函數被調用時都會開棧空間. 但在recursive的情況下, 同一個函數會開許多個棧空間.
就算沒有recursive, 每次被調用所開的棧空間通常不會一樣.棧空間中存放return address, parameter, local variable, return value.執行期對local variable取址就一定落在棧空間之內.各個函數都印parameter及local variable的地址. 多實驗幾次就可以推測出大概的范圍。
2、棧,可以看作是一摞卡片,最上面的卡片表示程序的當前作用域,這往往就是當前正在執行的函數。當前函數中聲明的所有變數都置於棧頂幀中,即佔用棧頂幀的內存,這就相當於一摞卡片中最上面的一張卡片。如果當前函數調用了另一個函數,舉例來說,當前函數foo()調用了另一個函數bar(),就會在這摞卡片上再加一個新的卡片,這樣bar()就有了自己的棧幀(stack frame)以供使用。從foo()傳遞到bar()的所有參數都會從foo()棧幀復制到bar()棧幀中。(註:棧幀很有意義,因為棧幀可以為每個函數提供一個獨立的內存工作區。如果一個變數是在foo()棧幀中聲明的,那麼調用bar()函數不會對它帶來改變,除非你專門要求修改這個變數。另外,foo()函數運行結束時,棧幀即消失,該函數中聲明的所有變數都不會再佔用內存了。)
Ⅹ C語言棧是什麼,棧在哪,需要定義嗎
棧有兩種
一種是操作系統中的
進程棧 或者線程棧 系統自動生成 不需要定義
一種是數據結構中的
需要自己實現。