当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行 。
堆:一般是在堆的头部用一个字节存放堆的大小 。堆中的具体内容有程序员安排 。
26存取效率的比较
char s1[] = "aaaaaaaaaaaaaaa"
char s2 = "bbbbbbbbbbbbbbbbb"
aaaaaaaaaaa是在运行时刻赋值的;
而bbbbbbbbbbb是在编译时就确定的;
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快 。
比如:
#include
void main()
{
char a = 1
char c[] = "1234567890"
char p ="1234567890"
a = c[1]
a = p[1]
return
}
对应的汇编代码
10: a = c[1]
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],cl
11: a = p[1]
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]
00401070 8A 42 01 mov al,byte ptr [edx+1]
00401073 88 45 FC mov byte ptr [ebp-4],al
第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了 。
27小结:
堆和栈的区别可以用如下的比喻来看出:
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小 。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大 。
堆和栈的区别主要分:
操作系统方面的堆和栈,如上面说的那些,不多说了 。
还有就是数据结构方面的堆和栈,这些都是不同的概念 。这里的堆实际上指的就是(满足堆性质的)优先队列的一种数据结构,第1个元素有最高的优先权;栈实际上就是满足先进后出的性质的数学或数据结构 。
虽然堆栈,堆栈的说法是连起来叫,但是他们还是有很大区别的,连着叫只是由于历史的原因 。
谁能帮我说下C语言中的堆栈个人认为楼上的不懂C语言堆栈到底是怎么回事,按楼上说法,只是大概讲了下栈,没有讲堆
要讲C语言的堆栈,要从计算机的数据内存分配讲起
____________________
|Stack区(数组,指针,结构体,局部变量)
____________________
|Static变量(静态变量,全局变量)
____________________
|Heep区(堆区)
____________________
|代码段
____________________
从上面示意图中可看出整个内存分配,堆分配是在内存中按块划分,也就是相对与函数malloc,realloc,calloc这3个函数为内存分配函数而且需要手动调用free函数释放资源,否则会造成大量的内存碎片
如果楼主不相信可以自己写一个死循环,内部调用malloc函数,创建N个内存块,运行一段时间后,绝对会造成系统瘫痪,资源被耗尽
栈区划分为计算机自身划分,即在函数或局部变量被调用时,系统自动为其分配栈,以后进先出为原则实现变量的保存,在函数调用完毕时,系统会自动释放栈内资源,所以,栈可以说是短命的(生存周期只在调用过程中)
这里只是粗略说了下堆和栈,另外再说下static-->静态区,全局变量或静态变量存放于静态区,只要代码中存在静态变量或全局变量,自动放于静态区,静态区存放的变量生存周期是整个程序结束时才释放
代码段区,顾名思义存放的是程序代码(暂时先这么理解)
PS:本人原创,最近发现一些人盗用本人回答的问题特此声明嘿嘿
____________________ _________
补充:
我对于C#不是很熟悉,而且我也是从事C开发的,对于面向对象语言应用不是很熟在这只能给出C++的代码代码有点长,不知道你能不能看的懂,才写的
#include <iostreamh>
#include <stdlibh>
#include <malloch>
#include <stringh>
#include <timeh>
#include <stdioh>
#include <asserth>
/
//基于数组的栈的实现
#define N 50
typedef struct Stack{
int top
int A[N]
}pStack
//Pop出栈
int Pop(pStack pst)
{
int e
if(pst->top == -1)
{
cout<<"Stack is empty!"<<endl
return -1
}
else
{
e = pst->A[pst->top]
pst->top--
//cout<<"The element "<<e<<" is pop"<<endl
return e
}
}
//Push入栈
void Push(pStack pst)
{
int e
if(pst->top == N-1)
{
cout<<"Stack is full!"<<endl
}
else
{
cout<<"Input the push number:"
cin>>e
pst->top++
- 计算机语言学考研考什么
- 抖音的长腿特效在哪里
- 寿司里面可以加什么
- 寿司里面脆脆的是什么
- 世界上速度最快的蓝鲸速度多少
- 世界上水晶之都是哪里
- 刘备是在哪里找到的赵云
- 夫妻语言暴力算家暴吗
- 启迪生命的梅语言表达特点
- cad考证在哪里报名