问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C语言中,形参是放在对应进程的堆栈或寄存器上的么?谁有详细资料...

发布网友 发布时间:2024-09-26 17:52

我来回答

3个回答

热心网友 时间:2024-11-18 14:39

个人认为楼上的不懂C语言堆栈到底是怎么回事,按楼上说法,只是大概讲了下栈,没有讲堆.

要讲C语言的堆栈,要从计算机的数据内存分配讲起.
____________________
| Stack区(数组,指针,结构体,局部变量)
____________________
| Static变量(静态变量,全局变量)
____________________
| Heep区(堆区)
____________________
| 代码段
____________________
从上面示意图中可看出整个内存分配,堆分配是在内存中按块划分,也就是相对与函数malloc,realloc,calloc.这3个函数为内存分配函数.而且需要手动调用free函数释放资源,否则会造成大量的内存碎片.

如果楼主不相信可以自己写一个死循环,内部调用malloc函数,创建N个内存块,运行一段时间后,绝对会造成系统瘫痪,资源被耗尽.

栈区划分为计算机自身划分,即在函数或局部变量被调用时,系统自动为其分配栈,以后进先出为原则实现变量的保存,在函数调用完毕时,系统会自动释放栈内资源,所以,栈可以说是短命的(生存周期只在调用过程中).

这里只是粗略说了下堆和栈,另外再说下static-->静态区,全局变量或静态变量存放于静态区,只要代码中存在静态变量或全局变量,自动放于静态区,静态区存放的变量生存周期是整个程序结束时才释放.

代码段区,顾名思义存放的是程序代码(暂时先这么理解).

PS:本人原创,最近发现一些人盗用本人回答的问题.特此声明.嘿嘿.

____________________ _________
补充:
我对于C#不是很熟悉,而且我也是从事C开发的,对于面向对象语言应用不是很熟.在这只能给出C++的代码.代码有点长,不知道你能不能看的懂,才写的.

#include <iostream.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <time.h>
#include <stdio.h>
#include <assert.h>
/*
//基于数组的栈的实现
#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++;
pst->A[pst->top] = e;
}
}
//清空栈
void empty(pStack pst)
{
pst->top = -1;
}
//判断栈是否为空
int IsEmpty(pStack pst)
{
if(pst->top == -1)
{
return 0;
// cout<<"The Stack is empty!"<<endl;
}
else
{
return 1;
// cout<<"The Stack is not empty!"<<endl;
}
}
//判断栈是否为满
int IsFull(pStack pst)
{
if(pst->top == N-1)
{
return 0;
}
else
{
return 1;
}
}
//初始化栈
void InitStack(pStack pst)
{
pst->top = -1;
}

void main()
{
Stack S;
InitStack(&S);
int n;
cout<<"How many times do you want to Push:";
cin>>n;
for(int i=0; i<n; i++)
{
Push(&S);
}
cout<<"How many times do you want to Pop:";
cin>>n;
for(i=0; i<n; i++)
{
cout<<"The element "<<Pop(&S)<<" is pop"<<endl;
}
cout<<"The Stack's stutor:"<<endl;

if(IsEmpty(&S) == 0)
{
cout<<"The Stack is empty!"<<endl;
}
else
{
cout<<"The Stack is not empty!"<<endl;
}

if(IsFull(&S) == 0)
{
cout<<"The Stack is full!"<<endl;
}
else
{
cout<<"The Stack is not full!"<<endl;
}

empty(&S);

cout<<"The Stack's stutor:"<<endl;
if(IsEmpty(&S) == 0)
{
cout<<"The Stack is empty!"<<endl;
}
else
{
cout<<"The Stack is not empty!"<<endl;
}
}
*/
typedef struct Stack{
Stack *prior;
Stack *next;
int element;
}*pStack;
//压栈
void Push(pStack *pst)
{
if((*pst) == NULL)
{
pStack S = (pStack)malloc(sizeof(Stack));
(*pst) = S;
(*pst)->next = NULL;
(*pst)->prior = NULL;
cout<<"Input the PUSH data:";
cin>>(*pst)->element;
}
else
{
pStack S = (pStack)malloc(sizeof(Stack));
(*pst)->next = S;
S->prior = (*pst);
S->next = NULL;
(*pst) = S;
cout<<"Input the PUSH data:";
cin>>(*pst)->element;
}
}
//判断是否为空
int IsEmpty(pStack pst)
{
if(pst == NULL)
{
cout<<"The Stack is empty!"<<endl;
return 1;
}
return 0;
}
//出栈
pStack Pop(pStack *pst)
{
if(IsEmpty((*pst)) == 1)
return (*pst);
pStack S = (*pst);
if((*pst)->prior == NULL)
{
cout<<"Out:"<<(*pst)->element<<endl;
(*pst) = NULL;
free(S);
return (*pst);
}
else
{
cout<<"Out:"<<(*pst)->element<<endl;
(*pst) = (*pst)->prior;
(*pst)->next = NULL;
free(S);
return (*pst);
}
}
//初始化栈
void InitStack(pStack pst)
{
pst = NULL;
}

void main()
{
pStack pS = NULL;
// InitStack(pS);
int n;
cout<<"How many times do you want to Push:";
cin>>n;
for(int i=0; i<n; i++)
{
Push(&pS);
}
pStack S;
S = Pop(&pS);
}

热心网友 时间:2024-11-18 14:35

在发生调用时都会约定好一个参数传递方式,是放寄存器中,还是放在堆栈中。
通常情况下,如果前面两三个参数会约定放到固定的哪几个寄存器,参数多时,寄存器放下不,就转放到堆栈中。这个一般不去去区分是形参还是实参的,只是会考虑参数个数

热心网友 时间:2024-11-18 14:32

不好意思,挖坟了
实在看不惯否定了别人又没说出答案的人,背下内存分配策略,抄个栈的实现就可以否定别人(@rockrider001)的优秀答案?问牛而答马。
引用一个答案,写得比较好。https://blog.csdn.net/huangkangying/article/details/45154983
见笑了各位,最近研究操作系统又找到这个问题了。
恩,还有某人说的堆,堆是用的指针,所以传参是传一个地址(即整数)。
看来百度知道当年就废了,也许这个产品定位就有问题,本来是很好的一个想法。
现在看来知乎也不远了。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
win7不能浏览网页,但用搜狗浏览器高速模式能上网,兼容就不行???求 ... ...64位 IE浏览器无法打开网页 搜狗浏览器可以打开 类似的新窗口网页都... 千牛工作台子账号怎么开权限?子账号的安全设置在哪里? 千牛怎么设置子账号-千牛设置子账号步骤 怎么把CD里的歌曲改成MP3格式? ...戴眼镜吗?想给孩子去检查一下,哪里比较推荐,渭南这块的 Windows Media Player将CD音乐转换为MP3 最简单的方法将CD转换为MP3音频文件(一步一步教你将CD音乐转换为MP3格 ... 孩子最近视力下降了有可能是近视吗?渭南哪里可以免费检查视力啊 奥运会跳远世界纪录 检测钢筋需要注意什么? c语言 我用结构体指针当作结构体数组 在一个函数里参数是这个结构体指... 钢筋检测哪些 将7.63350修约为四位有效数字的结果是7.634。( ) ...要用指针吗?如果返回结构体呢?函数在返回那些类型值时必须要用指针... 晨跑VS 夜跑,说出你的选择! OPPO手机如何设置禁止安装来自未知来源的应用软件? 墨雨云间沈玉容妹妹是谁演的 匡玉婷参演作品资料简介 墨雨云间主题曲是谁唱的 墨雨云间歌曲是谁唱的 电气图中的符号有什么意思? 墨雨云间音乐有哪些 下图电气符号是什么意思? 以下电气符号是什么意思 请问诸位大神,以下这个电气符号代表什么意思? 社保补缴和正常补收有什么区别? 南通江海电容器股份有限公司关于江海 社保基数上调是补缴养老还是医保? 大连初三化学辅导班有哪些 排名前五补习班 学大教育收费怎么样? 麻阳到凤凰的车有哪些? 房产继承要办理哪些手续?房屋继承需要哪些证明? 房屋遗产继承需要那些手续?如何办理? 男孩发育晚b超三条线吗 男孩女孩b超有哪些区别 2022民诉法关于香港户籍当事人如何送达 三星3819d型号手机恢复出厂后黑屏怎么办 求电视剧“我的父亲母亲” 三星手机3819d主页总现停止如何修护 梦见别人帮我用咖啡色的眼线笔画眉毛,是什么预兆 眼线和面部风水,女人纹眉会改变运势吗 三星g3819d进不了系统怎么办 元江风景区门票多少钱 三星手机G3819D出现secsetupwizard,应该怎么解决? 滇国史编辑推荐 刚买的g3819d现在手机不管点啥程序都要黑下屏好卡,点过后能稍微快些这... 三星3819d手机常出现天气精灵以停止吗这是怎么办 三星g3819d手机开机一会就死机,然后重启是什么毛病 河口古镇有哪些适合一个人散心的景点? 闭口粉刺最有用的药膏 兰州河口古镇游玩攻略,兰州古镇自驾旅游路线