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 的参数传进来。