《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

自动变量和开辟内存的生存期和作用域探讨相关推荐

  1. C++中 auto自动变量,命名空间,using作用以及作用域

     1.auto关键字的用途 A:自动变量,可以自动获取类型,输出,类似泛型 B:自动变量,可以实现自动循环一维数组 C:自动循环的时候,对应的必须是常量 2.auto自动变量,自动匹配类型的案例如 ...

  2. C语言中变量存储类别——自动变量,寄存器变量,静态外部链接;

    c提供了多种不同模型或存储类别在内存中存储数据. 作用域: 作用域描述程序中可访问标识符的区域. 作用域描述了程序中可以访问一个标识符的一个或多个区域.即变量的可见性. 一个变量的作用域可以是代码块作 ...

  3. c++内存分区、创建变量开辟内存

    一.代码区.全局区(静态区,常量区).堆区 代码区:存放函数体的二进制代码,由操作系统进行管理的 全局区:存放全局变量和静态变量以及常量 栈区:由编译器自动分配释放, 存放函数的参数值,局部变量等 堆 ...

  4. 变量(自动变量、静态变量、寄存器变量、外部变量)与C的内存分配malloc/free、calloc/recalloc

    C语言中的4种存储类别:自动变量(auto).静态变量(static).寄存器(register).外部变量(extern). 自动变量 通常定义在自定义函数内或代码段(用{}括起来的)定义的变量,都 ...

  5. C语言-变量生存期及作用域

    目录 1 变量的生存期和作用域 2 默认初始化规则(C++11) 1 变量的生存期和作用域 变量的储存方式:动态储存(自动.寄存器).静态储存(静态和外部) 储存方式 名称 自动变量 anto 寄存器 ...

  6. 什么变量在堆内存里存放,什么变量在栈内存里存放

    堆和栈的区别 (stack and heap) 一般认为在c中分为这几个存储区 1栈 - 有编译器自动分配释放 2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3全局区(静态 ...

  7. 【函数的定义、调用(嵌套调用、递归调用)、声明、函数的分类(有无返回值、有无参数)、变量(自动变量与静态变量、局部变量与全局变量、只读变量)】(学习笔记7--函数)

    第一篇博文,打卡新星计划第三季3.4~4.4,希望能有质的飞跃,顶峰相见 一.自定义函数 1.函数的定义 函数在使用前也需要定义,定义的格式如下: 数据类型 函数名([数据类型 参数1],[数据类型 ...

  8. 在堆区开辟内存(动态内存的开辟)

    目录 ​ 零.前言 1.基本概念 1.什么是动态内存 2.开辟动态内存的作用 1.在栈区开辟的空间 2.在堆区开辟空间 2.动态内存开辟的函数 1.void *malloc( size_t size ...

  9. C语言——动态开辟内存空间的函数

    目录 为什么需要动态开辟内存空间? 1.malloc函数 2.free函数 3.calloc函数 4.realloc 为什么需要动态开辟内存空间? 我们已经熟悉了基本的内存开辟方法: int a = ...

最新文章

  1. ubuntu16.04 安装网易云音乐
  2. java多线程 模型_一篇文章读懂Java多线程模型
  3. 电脑重新分区扩大c盘_两种方法,给电脑C盘增加10G的容量,电脑焕然一新
  4. C++学习之路 | PTA乙级—— 1046 划拳 (15 分)(精简)
  5. Emmet 也有快速生成文件头的功能
  6. android桌面快捷网页,Android向桌面添加快捷方式,使其指向特定的网页
  7. 64位MicrosoftOfficeWord加载EndnoteX7
  8. python合并多个txt文件
  9. 【项目管理/PMP/PMBOK第六版/新考纲】纯干货!项目经理/角色/项目经理的能力/项目经理的领导力/领导和管理/职位权力/个人权力/领导生命周期理论/仆人式领导
  10. 一文深入掌握druid
  11. 域名访问限制不严格漏洞 修复
  12. 网络攻击知识之几种IP地址攻击方式
  13. win10无法修改计算机域名,Win10无法打开网页提示“域名解析错误”怎么办?
  14. 智慧供水管网监测方案助力水资源高效利用
  15. 根据WebService地址展示方法列表、入参和返回值(解析wsdl)
  16. 组策略部署Office 2007
  17. 【JAVA程序设计】(C00101)基于Servlet的在线鞋店销售管理系统
  18. 语音朗读html的源码,网页中文本朗读功能开发实现分享
  19. vega8显卡和mx250哪个好_集成Vega 8 GPU游戏性能出色,远超GeForce MX250
  20. micropython 移植k210_嘉楠勘智K210支持最大国产开源RTOS及MicroPython

热门文章

  1. MongoDB工具最新进展
  2. 浙江电信网上营业厅的一个BUG(有更新)
  3. pythondef元组参数传递_Python参数传递(传值传引用)
  4. android xml黑体字_为 Android 换上任意喜欢的字体,你可以试试这个 Magisk 模块
  5. python不可实现的领域3d_岩土工程新手入门指南---FLAC3D学习指导与建议
  6. CSS系统学习之CSS简介
  7. SpringMVC注解驱动开发
  8. 04Linux与Unix的关系
  9. 数据结构 二叉树 java_数据结构—二叉树
  10. GP学习(七)—Accessing raster workspaces