自动变量和开辟内存的生存期和作用域探讨
《C程序设计》谭浩强第4版针对Auto变量的生存期作用域做出了说明,包括内存管理与释放,指出“函数执行完后,会自动释放自动变量所占用的内存单元”
做一下几种情况的讨论:
①函数结束后,自动变量会被释放,即便以指针的形式返回,返回后,指针地址没有变,但是,任何读取操作都会刷新这段内存到不可预知的状态。这种情况再VS2013编译的时候会有警告 warning C4172: 返回局部变量或临时变量的地址
②如果使用函数返回值,可以使用malloc申请内存,操作完成后return出去,这种情况下不需要指向指针的指针,而且外部可以使用free释放掉
③如果企图通过单指针参数在函数内部开辟内存VS2013编译器会给出警告: warning C4700: 使用了未初始化的局部变量“pFromParameter” ,而且,运行到调用函数处会崩溃
④如果需要在被调函数内部malloc内存,需要使用指向指针的指针,参考:在函数体内开辟动态内存时,函数形参选择指向指针的指针的原理解析 ,参数传递相关资料参考其他网友的博客:C/C++中函数参数传递详解
从以上内容及下文代码中的编译信息可以看出,VS2013的警告信息必须重视,应该处理到没有“警”告为止。
代码及运行结果如下(注意:为了演示,运行到第85行程序会崩溃,可以注释掉):
1 // CUITestingCPP.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 using namespace std; 7 8 typedef struct CvHistogra 9 { 10 int type; 11 float** thresh2; 12 int aas; 13 } 14 CvHistogra; 15 16 CvHistogra * ReturnAddOfAutoVariable() 17 { 18 CvHistogra AutoVariable; 19 AutoVariable.type = 2; 20 cout << "AutoVariable变量地址:" << &AutoVariable << endl; 21 cout << "AutoVariable成员type的值:" << AutoVariable.type << endl; 22 return &AutoVariable; //本行报警: warning C4172: 返回局部变量或临时变量的地址 23 } 24 25 CvHistogra * ReturnMallocMemeryToPointer() 26 { 27 CvHistogra * mallocPointerInFun = (CvHistogra*)malloc(sizeof(CvHistogra)); 28 mallocPointerInFun->type = 5; 29 cout << "mallocPointerInFun变量地址:" << mallocPointerInFun << endl; 30 cout << "mallocPointerInFun成员type的值:" << mallocPointerInFun->type << endl; 31 32 return mallocPointerInFun; 33 } 34 35 //将“单”指针作为参数,企图在函数内部malloc并通过参数返回出去,错误决定, 36 //这种单指针的传参必须传入已经拥有内存的指针,例如malloc过的、指向变量的、指向数组的 37 //如果希望在函数内malloc,并通过参数赋值给调用函数的指针,则被调函数必须是指向指针的指针 38 void PointerFromParameterMalloc(CvHistogra * pParameter) 39 { 40 pParameter = (CvHistogra*)malloc(sizeof(CvHistogra)); 41 pParameter->type = 5; 42 cout << "pParameter变量地址:" << pParameter << endl; 43 cout << "pParameter成员type的值:" << pParameter->type << endl; 44 } 45 46 int _tmain(int argc, _TCHAR* argv[]) 47 { 48 //--------------------使用函数返回值的方式将自动变量的地址return出去--------------------------/: 49 50 CvHistogra * pAddOfAutoVariable; 51 pAddOfAutoVariable = ReturnAddOfAutoVariable(); 52 53 cout << "pAddOfAutoVariable成员type的值:" << pAddOfAutoVariable->type << endl; 54 cout << "pAddOfAutoVariable成员type的值再输出一次值改变:" << pAddOfAutoVariable->type << endl; 55 cout << "pAddOfAutoVariable 指针的值没有改变:" << pAddOfAutoVariable << endl; 56 57 //free(histTest); 58 //pAddOfAutoVariable所指向的内存不是malloc开辟的,是栈上的内存,所以使用free释放失败 59 60 cout << endl; 61 cout << endl; 62 63 //-------------------------------------------------------------------------------------------/。 64 65 //--------------------在被调用函数中malloc内存return出去--------------------------/: 66 67 CvHistogra * pFromFunMalloc; 68 pFromFunMalloc = ReturnMallocMemeryToPointer(); 69 cout << "pFromFunMalloc 指针的值:" << pFromFunMalloc << endl; 70 cout << "pFromFunMalloc 成员type的值:" << pFromFunMalloc->type << endl; 71 cout << "pFromFunMalloc 成员type的值再输出一次也不变:" << pFromFunMalloc->type << endl; 72 73 pFromFunMalloc->aas = 9; 74 75 free(pFromFunMalloc); 76 //函数内malloc的内存,如果是return出来的,在外部可以使用free释放 77 pFromFunMalloc = NULL; 78 //释放完毕要置为null,不然下边一行还能够输出,只是输出的是错误的值 79 80 //--------------------------------------------------------------------------------/。 81 82 //--------------------传指针给函数参数,在被调函数中malloc内存--------------------------/: 83 84 CvHistogra * pFromParameter; 85 PointerFromParameterMalloc(pFromParameter);//本行报警,而且运行时崩溃:warning C4700: 使用了未初始化的局部变量“pFromParameter” 86 cout << "pFromParameter 指针的值:" << pFromParameter << endl; 87 cout << "pFromParameter 成员type的值:" << pFromParameter->type << endl; 88 89 //--------------------------------------------------------------------------------/。 90 91 system("pause"); 92 93 return 0; 94 }
运行结果:
转载于:https://www.cnblogs.com/tingshuixuan2012/p/4485527.html
自动变量和开辟内存的生存期和作用域探讨相关推荐
- C++中 auto自动变量,命名空间,using作用以及作用域
1.auto关键字的用途 A:自动变量,可以自动获取类型,输出,类似泛型 B:自动变量,可以实现自动循环一维数组 C:自动循环的时候,对应的必须是常量 2.auto自动变量,自动匹配类型的案例如 ...
- C语言中变量存储类别——自动变量,寄存器变量,静态外部链接;
c提供了多种不同模型或存储类别在内存中存储数据. 作用域: 作用域描述程序中可访问标识符的区域. 作用域描述了程序中可以访问一个标识符的一个或多个区域.即变量的可见性. 一个变量的作用域可以是代码块作 ...
- c++内存分区、创建变量开辟内存
一.代码区.全局区(静态区,常量区).堆区 代码区:存放函数体的二进制代码,由操作系统进行管理的 全局区:存放全局变量和静态变量以及常量 栈区:由编译器自动分配释放, 存放函数的参数值,局部变量等 堆 ...
- 变量(自动变量、静态变量、寄存器变量、外部变量)与C的内存分配malloc/free、calloc/recalloc
C语言中的4种存储类别:自动变量(auto).静态变量(static).寄存器(register).外部变量(extern). 自动变量 通常定义在自定义函数内或代码段(用{}括起来的)定义的变量,都 ...
- C语言-变量生存期及作用域
目录 1 变量的生存期和作用域 2 默认初始化规则(C++11) 1 变量的生存期和作用域 变量的储存方式:动态储存(自动.寄存器).静态储存(静态和外部) 储存方式 名称 自动变量 anto 寄存器 ...
- 什么变量在堆内存里存放,什么变量在栈内存里存放
堆和栈的区别 (stack and heap) 一般认为在c中分为这几个存储区 1栈 - 有编译器自动分配释放 2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3全局区(静态 ...
- 【函数的定义、调用(嵌套调用、递归调用)、声明、函数的分类(有无返回值、有无参数)、变量(自动变量与静态变量、局部变量与全局变量、只读变量)】(学习笔记7--函数)
第一篇博文,打卡新星计划第三季3.4~4.4,希望能有质的飞跃,顶峰相见 一.自定义函数 1.函数的定义 函数在使用前也需要定义,定义的格式如下: 数据类型 函数名([数据类型 参数1],[数据类型 ...
- 在堆区开辟内存(动态内存的开辟)
目录 零.前言 1.基本概念 1.什么是动态内存 2.开辟动态内存的作用 1.在栈区开辟的空间 2.在堆区开辟空间 2.动态内存开辟的函数 1.void *malloc( size_t size ...
- C语言——动态开辟内存空间的函数
目录 为什么需要动态开辟内存空间? 1.malloc函数 2.free函数 3.calloc函数 4.realloc 为什么需要动态开辟内存空间? 我们已经熟悉了基本的内存开辟方法: int a = ...
最新文章
- ubuntu16.04 安装网易云音乐
- java多线程 模型_一篇文章读懂Java多线程模型
- 电脑重新分区扩大c盘_两种方法,给电脑C盘增加10G的容量,电脑焕然一新
- C++学习之路 | PTA乙级—— 1046 划拳 (15 分)(精简)
- Emmet 也有快速生成文件头的功能
- android桌面快捷网页,Android向桌面添加快捷方式,使其指向特定的网页
- 64位MicrosoftOfficeWord加载EndnoteX7
- python合并多个txt文件
- 【项目管理/PMP/PMBOK第六版/新考纲】纯干货!项目经理/角色/项目经理的能力/项目经理的领导力/领导和管理/职位权力/个人权力/领导生命周期理论/仆人式领导
- 一文深入掌握druid
- 域名访问限制不严格漏洞 修复
- 网络攻击知识之几种IP地址攻击方式
- win10无法修改计算机域名,Win10无法打开网页提示“域名解析错误”怎么办?
- 智慧供水管网监测方案助力水资源高效利用
- 根据WebService地址展示方法列表、入参和返回值(解析wsdl)
- 组策略部署Office 2007
- 【JAVA程序设计】(C00101)基于Servlet的在线鞋店销售管理系统
- 语音朗读html的源码,网页中文本朗读功能开发实现分享
- vega8显卡和mx250哪个好_集成Vega 8 GPU游戏性能出色,远超GeForce MX250
- micropython 移植k210_嘉楠勘智K210支持最大国产开源RTOS及MicroPython