精华内容
下载资源
问答
  • 函数调用下形参和实参的内存分配

    千次阅读 2013-04-15 21:45:43
    作为一个接触C/C++不久的小菜鸟,常常对函数形参和实参的内存分配和调用很费解,现就最近心得总结如下;...1,形参变量只有在被调用时才分配内存单元,在调用结束后,即可释放所分配的内存单元。因此

       作为一个接触C/C++不久的小菜鸟,常常对函数形参和实参的内存分配和调用很费解,现就最近心得总结如下;

    函数形参和 实参具有以下特点

    #include<iostream.h>

    int Max(int x,int y)

    {

       return x>y? x:y;

    }

    void main()

    {

       cout<<"Max is..."<<Max(4,8)<<endl;  //函数调用

    }

    1,形参变量只有在被调用时才分配内存单元,在调用结束后,即可释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参那变量。

    2、实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,他们都必须具有确定的值,以便吧这些值传送给形参。因此,预先用赋值、输入等方法是实参获得确定值。

    3、实参和形参在数量上、类型上、顺序上应严格一致,否则会发生类型不匹配的错误;

    4、函数调用中发生的数据传送是单向的。即只能把实参传送给形参,而不能把形参的值传送给实参。因此在函数调用过程中,形参的值发生改变,而实参中的值不会发生改变。

     形参只在这个函数执行的时候才会被分配内存,当函数执行完毕后分配的内存会被释放。至于理由……函数的参数属于局部变量,如果一开始就分配的话,别的地方也能访问修改,数据就不确定了。
    另外,函数的形参实际是:调用此函数前,将实参压入堆栈,然后跳转到函数的地址执行。函数执行完跳回去时,堆栈弹出,内存释放。

    当一个函数的运行期间调用另一个函数时,在运行被调函数之前,系统需要完成三件事:

       1、将所有的实参、返回地址等信息传递给被调函数保存。

       2、为被调函数的局部变量(包括形参)分配内存空间;

       3、将控制转移到被调函数的入口;



    从被调函数返回主调函数之前,系统也要完成三件事

        1、保存被调函数的返回结果;

         2、释放被调函数所占的存储空间;

         3、依照被调函数返回的地址将控制转移到调用函数;

    当有多个函数调用时,按照“后调用先返回”的原则,上述函数之间的信息传递和控制转移必须借助“栈”来实现,机系统整个程序运行时所需的数据空间安排在一个栈中,每当调用一个函数时,就在栈顶分配一个存储区,进行压栈操作,每当一个函数退出时,就释放它的存储区,执行出栈操作,当前运行的函数永远就在栈顶位置。


    具体内存分配细解可参看<<C深度剖析>>


    那么在什么情况下不给形参和实参分配内存大小呢?????

    Windows中以__fastcall调用的时候是可以的,因为前两个参数不被放到堆栈中传入,而是传到寄存器中,这样可以不占用内存。


    c方式的_cdecl调用参数必须要压栈,所以不占内存是不现实的。






       

    展开全文
  • 在程序运行过程中向计算机申请分配一段存储单元或把早先申请的内存给计算机。 在编写程序时,通常不知道需要处理的数据量,或者难以估计所需处理数据量的变动程度。在这种情况下,要达到有效的资源利用,必须在运行...

    动态内存管理:

    在程序运行过程中向计算机申请分配一段存储单元或把早先申请的内存给计算机。

    在编写程序时,通常不知道需要处理的数据量,或者难以估计所需处理数据量的变动程度。在这种情况下,要达到有效的资源利用,必须在运行时动态地分配所需内存,并在使用完毕后尽早释放不需要的内存,这就是动态内存分配的原理。

    动态内存管理同时还具有一个优点:当程序在具有更多内存的系统上需要处理更多的数据时,不需要重写程序。

    malloc函数和free函数

    1.malloc函数申请分配内存空间

    • 定义:void *malloc(usigned size)
    • 返回:NULL或一个指针
    • 说明:申请成功则返回分配空间的起始地址,否则返回NULL。

    2.free函数是malloc函数的逆过程

    • 定义:void free(ptr)
    • 返回:无
    • 说明:把指针ptr所指向的一段内存单元释放

    两个函数都包含在头文件stdlib.h和malloc.h中。

    动态内存分配的例子:

    #include<stdio.h>
    #include<malloc.h>
    #include<stdlib.h>
    int main()
    {
    	int* p;
    	if ((p = (int*)malloc(sizeof(int))) == NULL)
    	{
    		printf("error on malloc!");
    		exit(1);
    	}
    	*p = 580;
    	printf("%5d,%ld\n", *p, p);
    	free(p);
    	if ((p = (int*)malloc(sizeof(int))) == NULL)
    	{
    		printf("error on malloc!");
    		exit(1);
    	}
    	*p = 1200;
    	printf("%d,%ld\n", *p, p);
    	free(p);
    	return 0;
    }

    指针类型数据

    定义 含义
    int *p p为指向整型数据的指针变量
    int *p[n] 定义指针数组p,由n个指向整型数据的指针元素组成
    int (*p)[n] p为指向含n个整型元素的一维数组的指针变量
    int *p(形参列表)

    p是返回指针的函数,该指针指向整型数据类型

    int (*p)(形参表) p为指向函数的指针,该函数返回一个整型值
    void *p p是可以指向任何类型数据的指针变量
    int **p p是一个二级指针变量,它指向一个指向整形数据的指针变量

     

    指针变量赋值的含义

    赋值格式 含义
    p=&a 将变量a的地址赋值给指针变量p
    p=array;或p&array[0] 将数组array的首地址赋给指针变量p
    p=&array[i] 将数组元素array[i]的地址赋给指针变量p
    p=function 将函数function()的入口地址赋给指针变量p
    p1=p2 将指针变量p2的值赋给指针变量p1
    p=p+i 将指针变量p往后挪动i个元素位置(仅限于数组情形)

     

    展开全文
  • 实参和与其对应的形参各占用独立的存储单元关注:90答案:6mip版解决时间 2021-01-27 22:41提问者花开不败2021-01-26 22:07B.实参和与其对应的形参共占用一个存储单元C.只有当实参和与其对应的形参同名时才共占用...

    以下正确的说法是( )。在C语言中: A.实参和与其对应的形参各占用独立的存储单元

    关注:90  答案:6  mip版

    解决时间 2021-01-27 22:41

    e6cb1a03ad541b3098697807b7bf1798.png

    提问者花开不败

    2021-01-26 22:07

    B.实参和与其对应的形参共占用一个存储单元

    C.只有当实参和与其对应的形参同名时才共占用存储单元

    D.形参是虚拟的,不占用存储单元

    最佳答案

    e6cb1a03ad541b3098697807b7bf1798.png

    二级知识专家你的偏见

    2021-01-26 22:54

    选A。

    函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。

    形参只是实参的一个副本,即拷贝,它们不能公用存储单元,不占相同的空间。

    全部回答

    e6cb1a03ad541b3098697807b7bf1798.png

    1楼在時光深處躲貓貓

    2021-01-27 01:51

    没错 是D 当变量名为函数参数,函数调用时形参是虚拟的,不占用存储单元

    e6cb1a03ad541b3098697807b7bf1798.png

    2楼幼稚园小班大佬

    2021-01-27 01:13

    .C语言程序一般由若干个函数构成,程序中应至少包含一个________min 函数_,其名称只能为____主函数_____

    e6cb1a03ad541b3098697807b7bf1798.png

    3楼风是甜的

    2021-01-27 00:43

    答案:a. 在c语言中,实参与其对应的形参各占独立的存储单元;

    e6cb1a03ad541b3098697807b7bf1798.png

    4楼酒空人散

    2021-01-27 00:20

    在C语言中实参和与其对应的形参共占用一个存储单元。

    C语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。

    C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括一些类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。

    扩展资料

    基本特性

    1、高级语言:它是把高级语言的基本结构和语句与低级语言的实用性结合起来的工作单元。

    2、结构式语言:结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。

    C 语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。

    3、代码级别的跨平台:由于标准的存在,使得几乎同样的C代码可用于多种操作系统,如Windows、DOS、UNIX等等;也适用于多种机型。C语言对编写需要进行硬件操作的场合,优于其它高级语言。

    4、使用指针:可以直接进行靠近硬件的操作,但是C的指针操作不做保护,也给它带来了很多不安全的因素。C++在这方面做了改进,在保留了指针操作的同时又增强了安全性,受到了一些用户的支持,但是,由于这些改进增加语言的复杂度,也为另一部分所诟病。

    Java则吸取了C++的教训,取消了指针操作,也取消了C++改进中一些备受争议的地方,在安全性和适合性方面均取得良好的效果,但其本身解释在虚拟机中运行,运行效率低于C++/C。一般而言,C,C++,java被视为同一系的语言,它们长期占据着程序使用榜的前三名。

    参考资料来源:百度百科-c语言

    e6cb1a03ad541b3098697807b7bf1798.png

    5楼落爺英雄遲暮

    2021-01-27 00:15

    参数之间的传递分为数值传递与地址传递,如果是数值传递时,各自占用不同的内存单元,如果是地址传递时,共用同一段内存单元。

    我要举报

    如以上问答内容为低俗/色情/暴力/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!

    →点此我要举报以上信息!←

    推荐资讯

    大家都在看

    展开全文
  • 自动变量(auto变量)函数中的局部变量,如果不专门声明为(static)静态存储类别,都是动态分配存储空间的,数据存储动态存储区中。形参与函数中定义的局部变量,都是自动变量,在调用结束就会自动释放这些存储空间...

    C语言的存储类别包括4种:自动的(auto)、静态的(static)、寄存器(register)、外部的(exteren)

    1.自动变量(auto变量)

    函数中的局部变量,如果不专门声明为(static)静态存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。

    形参与函数中定义的局部变量,都是自动变量,在调用结束就会自动释放这些存储空间

    2.静态局部变量(static局部变量)

    (1)静态局部变量属于静态存储类别,在静态存储区分配存储单元,在程序整个运行期间都不释放。而自动变量(动态局部变量)属于动态存储类别,分配在动态存储区空间而不在静态存储空间,函数调用结束后即释放。

    (2)对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时已有初值,以后每次调用不需要重新赋值,而是只保留

    上次函数调用结束时的值,对自动变量赋初值,不是在编译时进行的,而是在函数调用时进行的,每调用一次函数重新给一次初值,相当于执行一次赋值语句。

    (3)如果在定义局部变量时不赋初值,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符'\0'(对字符变量)。而对自动变量来说,它的值是一个不确定的值,这是由于每次函数调用结束后存储单元已释放,下次调用时又重新分配存储单元,而所分配的单元中的内容是不可知的

    (4)虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的。因为它是局部变量,只能被本函数引用。

    3.寄存器变量(register变量)

    一些变量使用频繁,存取变量要花费不少时间,提高效率,允许把局部变量放在CPU中的寄存器中,直接从寄存器中存取,可以提高执行效率,这种变量叫做寄存器变量

    3种局部变量的存储位置不同的;自动变量存储在动态存储区,静态变量存储在静态存储区、寄存器存储在CPU中的寄存器中

    4.全局变量的存储类别

    全局变量都是存放在静态存储区中的,生存期是固定的,存在于整个运行过程。

    一般来说,外部变量是在函数的外部定义的全局变量,它的作用域是从变量的定义处开始,到本程序文件的结尾。

    (1)在一个文件内扩展外部变量的作用域

    extern:不是定义变量,可以不指定类型,只要名称即可

    extern int A;

    或者

    extern A;

    int main(){

    extern A //在主函数内可以使用A,将A的作用域扩展到此处

    }

    int A;

    (2)将外部变量的作用域扩展到其他文件

    文件1 file.c中定义 int A;

    文件2 file2.c中使用 extern A;

    (3)将外部变量的作用域限制在本文件内

    static int A; //静态外部变量

    用static声明变量的作用是

    (1)对局部变量用static声明,把它分配在静态存储区,该变量在整个程序执行期都不释放,其所在的分配的空间始终存在

    (2)对于全局变量用static声明,则该变量的作用域只限于本文件模块(即是被声明的文件中)

    (4)存储类别总结:

    static int a; //静态局部整型变量或静态外部整型变量

    auto char c; //自动变量,在函数内定义

    register int d; //寄存器变量,在函数内定义

    extern B; //将已定义的外部变量b的作用域扩展至此

    0057ccf9657a224f8c2568af991d44c9.png

    d0039a15cd681addfd03c527eb9f2760.png

    bfae70b15289821baff72de40c7728af.png

    一个变量的属性可以从两个方面

    (1)作用域:从空间角度

    定义:一个变量在某一文件或者函数范围内有效,则被称为该变量的作用域,称为变量的可见性

    (2)生存期:从时间角度

    定义:在某一时刻时存在的,认为该时刻属于该变量的生存期

    各种类型变量的作用域和存在性的情况

    变量存储类型

    函数内

    函数外

    作用域

    存在性

    作用域

    存在性

    自动变量和寄存器变量

    ×

    ×

    静态局部变量

    ×

    静态外部变量

    √(只限本文件)

    外部变量

    (3)static对于全局变量和局部变量作用不同

    对于局部变量来说,它使变量由动态方式改变为静态存储方式

    对于全局变量来说,它使变量局部化,但是仍为静态存储

    从作用域来看

    凡是由static声明的,其作用域都是局限的,或者局限于本函数内(静态局部变量),或者局限于本文件内(静态外部变量)。

    5.关于变量的声明和定义

    一个函数一般有两部分组成:声明部分和执行语句

    声明部分的作用是对有关标识符(如变量、函数、结构体、共用体等)属性进行声明

    函数的声明是函数的原型,而函数的定义是对函数功能的定义。

    对被调用函数的声明是放在主调函数的声明部分中的,而函数定义显然不在声明部分的范围内,它是一个独立的模块

    声明:是不需要建立存储空间,声明只是为了扩展该变量的作用范围而做的“声明”。

    定义:需要建立存储空间

    6.内部函数与外部函数

    (1)内部函数又被称为静态函数,用static声明的

    如果一个函数只能被本文件中其他函数调用,它被称为内部函数,在定义内部函数时,在函数名和函数类型的前面加static,即

    static 类型名 函数名(形参表);

    static fun(int a,int b);

    (2)外部函数

    extern 类型名 函数名(形参表);

    extern fun(int a,int b);

    // 或者省略不写 默认

    fun(int a,int b);

    展开全文
  • 一下都是网上的主要摘要,记录...说明了函数处理引用和指针实参上的不同,引用只是一个别名,并不会对引用形参重新分配内存单元,而只会对指针形参重新分配内存单元,产生了一份指针的副本  
  • 静态存储动态存储详解

    千次阅读 2015-04-01 22:29:07
    典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配, 调用函数完毕立即释放。如果一个函数被多次调用,则反复地分配、 释放形参变量的存储单元。从以上分析可知,
  • 静态存储动态存储

    2015-05-25 17:26:00
    变量的存储方式可分为“静态存储”和“动态存储”两种  静态存储变量通常是在变量定义... 典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配, 调用函数完毕立即
  • 20180513 实参 形参

    2018-05-13 21:06:00
    实参和与其对应的形参各占用独立的存储单元 实参和与其对应的形参共占用一个存储单元 只有当实参和与其对应的形象同名时才共占用存储单元 形参是虚拟的,不占用存储单元正确答案:A 错选:D 1、形参...
  • 实参与形参

    千次阅读 2010-10-11 16:02:00
    形参:在定义函数中指定的参数就是形参,在未出现函数调用时,他们并不占内存中的存储单元,只有在发生函数调用时,函数中的形参才被分配内存单元。在调用结束后,形参所占的内存单元也被释放。   ...
  • 动态存储和静态存储区域区别

    千次阅读 多人点赞 2017-11-27 19:19:23
     典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配, 调用函数完毕立即释放。如果一个函数被多次调用,则反复地分配、 释放形参变量的存储单元。 静态存储方式...
  • 典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配,调用函数完毕立即释放。如果一个函数被多次调用,则反复地分配、释放形参变量的存储单元。 静态存储方式 所谓...
  • 形参与实参

    2018-03-16 17:14:31
    形参在未出现函数调用时,不占内存的存储单元。只有在发生函数调用的时候形参才被分配内存单元,以便接受实参传来的数据。实参变量对形参变量的数据传递是“值传递”,即单向传递,只能实参传给形参。调用结束后,...
  • 典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配,调用函数完毕立即释放。如果一个函数被多次调用,则反复地分配、 释放形参变量的存储单元。 从以上分析可知, ...
  • 线性表的动态分配顺序存储结构

    千次阅读 2015-11-05 20:40:27
    如果用数组表示顺序表,那很简单,也不实用,不能改变存储容量,下面是动态分配的顺序表的表示和操作 ADT.h头文件  头文件 ADTList.c文件  1 /*********************************...
  • C静态存储动态存储

    2013-01-17 21:05:00
    典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配, 调用函数完毕立即释放。如果一个函数被多次调用,则反复地分配、 释放形参变量的存储单元。 静态存储方式 ...
  •  典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配, 调用函数完毕立即释放。如果一个函数被多次调用,则反复地分配、 释放形参变量的存储单元。 静态存储...
  • 动态存储实现通讯录

    2016-05-21 16:17:59
    典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配, 调用函数完毕立即释放。如果一个函数被多次调用,则反复地分配、 释放形参变量的存储单元
  • 动态内存分配

    2019-06-10 13:15:53
    内存的存储分为俩种,一...在调用函数时给形参分配存储空间。 2)函数中定义的没有关键字static声明的变量,即自动变量。 3)函数调用时现场保护和返回的地址。 C语言提供了一个动态内存开辟的函数: void* malloc ...
  • C语言中函数形参与实参的区别

    千次阅读 多人点赞 2019-06-12 10:47:13
    形参:在定义函数时指定的参数,在未出现函数调用时,他们并不占用内存中的存储单元。只有在发生函数调用时,函数中的形参才被分配内存单元。在函数调用结束后,形参所占用的内存单元也被释放。 实参:即你调用函数...
  • 在计算机的系统中有四个内存区域:1)栈:在栈里面存储一些我们定义的局部变量和形参。2)字符常量区:主要存储一些字符常量,...3)全局区:在全局区里储存一些全局变量和静态变量4)堆:主要是通过动态分配的储存空
  • 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。 实参可以是常量、变量、表达式、函数等,...
  • 形参的选择

    2020-08-11 22:05:45
    形参的选择 (单向引用)传值:值传递,发生...引用传递本身不占用存储单元,即系统不会给其分配存储单元 选择指导原则: 对于使用传递值而不做修改的函数: 如果数据对象较小,如内置数据类型或者小型结构,则按

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,079
精华内容 7,231
关键字:

形参的存储单元是动态分配的