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

  《C程序设计》谭浩强第4版针对Auto变量的生存期作用域做出了说明,包括内存管理与释放,指出“函数执行完后,会自动释放自动变量所占用的内存单元”

  函数结束后,自动变量会被释放,即便以指针的形式返回,返回后,指针地址没有变,但是,任何读取操作都会刷新这段内存到不可预知的状态

如果使用函数返回值,可以使用malloc申请内存,操作完成后return出去

代码及运行结果如下:

 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 * createHist()
17 {
18     CvHistogra hist_value;
19     hist_value.type = 2;
20     cout << "hist_value变量地址:" << &hist_value << endl;
21     cout << "hist_value成员type的值:" << hist_value.type << endl;
22     return &hist_value;
23 }
24
25 CvHistogra * mallocHist()
26 {
27     CvHistogra *  hist_value = (CvHistogra*)malloc(sizeof(CvHistogra));
28     hist_value->type = 5;
29     cout << "hist_value变量地址:" << hist_value << endl;
30     cout << "hist_value成员type的值:" << hist_value->type << endl;
31
32     return hist_value;
33 }
34
35 int _tmain(int argc, _TCHAR* argv[])
36 {
37     CvHistogra * histTest;
38     histTest = createHist();
39
40     cout << "histTest成员type的值:" << histTest->type << endl;
41     cout << "histTest成员type的值再输出一次值改变:" << histTest->type << endl;
42     cout << "histTest  指针的值:" << histTest << endl;
43
44     //free(histTest);//histTest所指向的内存不是malloc开辟的,是栈上的内存,所以使用free释放失败
45
46     cout << endl;
47     cout << endl;
48
49     CvHistogra * mallHist;
50     mallHist = mallocHist();
51     cout << "mallHist  指针的值:" << mallHist << endl;
52     cout << "mallHist 成员type的值:" << mallHist->type << endl;
53     cout << "mallHist 成员type的值:" << mallHist->type << endl;
54
55     mallHist->aas=9;
56
57     free(mallHist);
58     mallHist = NULL; //释放完毕要置为null,不然下边一行还能够输出,只是输出的是错误的值
59     //cout << "mallHist 成员type的值:" << mallHist->type << endl;
60
61     system("pause");
62
63     return 0;
64 }

时间: 2024-10-18 15:26:57

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

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

 1.auto关键字的用途 A:自动变量,可以自动获取类型,输出,类似泛型 B:自动变量,可以实现自动循环一维数组 C:自动循环的时候,对应的必须是常量 2.auto自动变量,自动匹配类型的案例如下: 3.通过auto关键字自动循环一维数组的案例 #include<iostream> #include<stdlib.h> #include<iomanip> usingnamespacestd; voidmain() { //定义一维数组,下面的数组名是一个指针常量

编程题:展示自动变量在内存中的生存期。

#include<stdio.h> void f(int n) { auto int s=0;  /*auto可以省略*/ s=s+1; printf("No.%d:s=%d\n",n,s); } void main() { int num; for(num=1;num<4;num++) f(num); } 编程题:展示自动变量在内存中的生存期.,布布扣,bubuko.com

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

什么变量在堆内存里存放,什么变量在栈内存里存放 堆和栈的区别 (stack and heap) 一般认为在c中分为这几个存储区 1栈 - 有编译器自动分配释放 2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域. 程序结束释放. 4另外还有一个专门放常量的地方. - 程序结束释放 在函数体中定义的变量通常是在栈上,用mal

【C/C++学院】0819-/类的成员函数与const-mutable /构造与析构/拷贝构造deletedefault以及深浅拷贝/静态成员函数成员变量类在内存的存储默认参数/友元类以及友元函数

类的成员函数与const-mutable 成员函数 Fushu.h #pragma once #include <iostream> class fushu { public: int x; int y; public: fushu(); ~fushu(); void show(); inline void showall(int x, int y);//显式内联 void setxy(int x, int y);//编译器优化,默认隐式内联 void show(int x, int y);

C语言学习笔记:12_变量的存储方式和生存期

/* * 12_变量的存储方式和生存期.c * * Created on: 2015年7月5日 * Author: zhong */ #include <stdio.h> #include <stdlib.h> /** * 从变量的作用域分: 全局变量,局部变量 * 从变量存在的时间(生命周期)分:静态存储方式,动态存储方式 * * 静态存储方式:在程序运行期间由系统分配固定的存储空间的方式 * 动态存储方式:在程序运行期间根据需要进行动态的分配存储空间的方式. * * 数据存放的

《转载》什么变量在堆内存里存放,什么变量在栈内存里存放

堆和栈的区别 (stack and heap) 一般认为在c中分为这几个存储区 1栈 - 有编译器自动分配释放 2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域. 程序结束释放. 4另外还有一个专门放常量的地方. - 程序结束释放 在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内

自动变量非自动变量

自动变量,就是普通的局部变量 相对于静态变量而言的 非自动变量有两种,一种是全局变量,一种是静态变量 自动的意思就是在一定的作用域内会自动消亡 非自动就是不会自己释放内存,每次访问改变值后,值会一直保存在那里

C++中用new开辟内存空间和非new开辟内存空间的区别

#include <iostream> using namespace std; class A { private: int n; public: A(int m):n(m) { } ~A(){} }; int main() { A a(1); //栈中分配 A b = A(1); //栈中分配 A* c = new A(1); //堆中分配 delete c; return 0; } 复制代码 第一种和第二种没什么区别,一个隐式调用,一个显式调用,两者都是在进程虚拟地址空间中的栈中分配内存

【C/C++学院】0814-引用高级、引用高级增加/auto自动变量自动根据类型创建数据/Bool/Enum/newdelete全局/大数据乘法与结构体/函数模板与auto/宽字符本地化/inline

引用高级.引用高级增加 #include<iostream> #include<stdlib.h> // int a[10] // int (&ra)[10] // int a[2][5] // int (&ra)[2][5] void main1() { int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int(&ra)[10](a);//引用就是给原来的变量有一个别名同一个地址 int i = 0; for (