关于内存管理实例

 1 void GetMemory(char *p)
 2 {
 3     p = (char*)malloc(100);
 4 }
 5
 6 void Test(void)
 7 {
 8     char *str = NULL;
 9     GetMemory(str);
10     strcpy(str, "helloworld");
11     printf(str);
12 }
13
14 运行Test函数会有什么样的结果?
15 答:
16     程序崩溃;原因:1、实参是通过拷贝的方式
17     传递给行参的;str本身的值依旧是存放
18     了NULL的地址(程序头的空白地址);
19     2、malloc之后没有释放内存;
20
21 char *GetMemory(void)
22 {
23     char p[] = "hello world";
24     return p;
25 }
26
27 void Test(void)
28 {
29     char *str = NULL;
30     str = GetMemory();
31     printf(str);
32 }
33 运行Test函数会有什么样的结果?
34 答:打印乱码,原因:1、p字符串数组的空间是在栈上
35     开辟的,函数执行完之后,该空间释放了;
36     str指向了“栈内存”,不是NULL,但数据不存在了;
37     第23行,与char*  p = "hello world";
38     有本质的不同;(此处,p指向静态数据区,函数
39     中这样做没有问题)
40     2、printf访问栈内存,很可能存的是垃圾值。
41
42 void  GetMemory(char **p, int num)
43 {
44     *p = (char*)malloc(num);
45 }
46
47 void Test(void)
48 {
49     char *str = NULL;
50     GetMemory(&str, 100);
51     strcpy(str, "hello");
52     printf(str);
53 }
54
55
56 运行Test函数会有什么样的结果?
57 答:能正常输出,但是malloc没有free,内存泄露;
58     注意:值传递(任何时候,参数传递都是拷贝形式);
59 void Test(void)
60 {
61     char* str = (char*)malloc(100);
62     strcpy(str, "hello");
63     free(str);
64     if(str!=NULL)
65     {
66         strcpy(str, "world");
67         printf(str);
68     }
69 }
70 运行Test函数会有什么样的结果?
71 答:篡改动态内存区的内容。后果难以确定;
72     因为free(str)之后,str成为野指针;     str仍有指向原来指向这块空间的指针还存在,只不过现在指针指向的内容是无用的,未定义的。
    因此,释放内存后把指针指向NULL,防止指针在后面不小心又被引用。
73   if(str!=NULL)语句不起作用;
时间: 2024-09-27 23:10:05

关于内存管理实例的相关文章

Block内存管理实例分析

在ios开发中,相信说道block大家都不陌生,内存管理问题也是开发者最头疼的问题,网上很多讲block的博客,但大都是理论性多点,今天结合一些实例来讲解下. 存储域 首先和大家聊聊block的存储域,根据block在内存中的位置,block被分为三种类型: NSGlobalBlock NSStackBlock NSMallocBlock 从字面意思上大家也可以看出来 NSGlobalBlock是位于全局区的block,它是设置在程序的数据区域(.data区)中. NSStackBlock是位于

java内存管理机制

JAVA 内存管理总结 1. java是如何管理内存的 Java的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 (Heap)中分配空间.释放 :对象的释放是由垃圾回收机制决定和执行的,这样做确实简化了程序员的工作.但同时,它也加重了JVM的工作.因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请.引用.被引用.赋值等,GC都需要进行监控. 2. 

JAVA 内存管理总结

1. java是如何管理内存的 Java的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 (Heap)中分配空间.释放 :对象的释放是由垃圾回收机制决定和执行的,这样做确实简化了程序员的工作.但同时,它也加重了JVM的工作.因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请.引用.被引用.赋值等,GC都需要进行监控. 2. 什么叫java的内存泄露

蓝懿教育 Objective-C 内存管理

一.内存管理笔记 1.OC内存管理,管理堆栈内存,主要管理对象是堆内存. 2.内存计数:有指向它的,它的计数则加一.或者说有人引用它,计数加一. 3.没有人引用之后,内存计数为0.对象被销毁.内存被释放. ARC 编译器自动加release 自动内存管理 对局部变量出括号,自动减1. mrc 手动内存管理. [a1 release] 释放一个,内存计数减一. 二.所有对象引用计数为0时,要释放内存的时候,都将调用:方法 dealloc. 上课以微信打飞机,为内存管理实例.讲解了当敌机被打死的时候

windows内存详解(一) 全面介绍Windows内存管理机制及C++内存分配实例

十分感谢MS社区的帖子,讲得很好~ http://social.technet.microsoft.com/Forums/zh-CN/2219/thread/afc1269f-fe08-4dc7-bb94-c395d607e536 (一):进程空间 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本文目的: 对Windows内存管理机制了解清楚,有效的利用C+

内存管理单元编程实例【转】

转自:http://blog.chinaunix.net/uid-29091195-id-4020919.html 一.MMU初步了解    概念:内存管理单元(memory management unit),简称MMU    主要作用:负责虚拟地址到物理地址之间的转换             提供硬件机制的内存访问权限检查        发展由来:由于程序的大小逐步发展到大于内存的大小这一问题的出现    导致了虚拟存储器的产生,虚拟存储器的基本思想是:数据.堆栈的总    大小可以超越物理存

Obstack是C标准库里面对内存管理的GNU扩展

Obstack介绍 Obstack初始化 在Obstack中申请对象 释放对象 申请growing object 获取Obstack状态 数据对齐 以下是来自wiki对obstack的介绍: Obstack是C标准库里面对内存管理的GNU扩展(实际上就是GNU C library了).Obstack===Object stack.没错,Obstack就是一个栈,栈里面的元素是对象object(不是面向对象的对象哦,这里的对象单指数据元素).这些数据是动态的,也就是使用的是动态内存.这种内存管理技

linux内核探索之内存管理(四):对页表和页表项的操作

接上一节,主要参考<深入Linux内核架构>(3.3节),即linux-3.18.3 1. 对PTE的操作 最后一级页表中的项不仅包含了指向页的内存位置的指针,还在上述的多于比特位包含了与页有关的附加信息.尽管这些数据是特定于CPU的,它们至少提供了有关页访问控制的一些信息.下列位在linux内核支持的大多数CPU中都可以找到. arch/x86/include/asm/pgtable_types.h #define _PAGE_BIT_PRESENT 0 /* is present */ #

linux内核探索之内存管理(二):linux系统中的内存组织--结点、内存域和页帧

本文主要参考<深入linux内核架构>(3.2节)及Linux3.18.3内核源码 概述:本文主要描述了内存管理相关的数据结构:结点pg_data_t.内存域struct zone以及页帧(物理页):struct page ,以及该结构相关的一些基本概念. 1. 概述 内存划分为接点,每个结点关联到系统中的一个处理器,在内核中表示为pg_data_t. 各个结点又划分为内存域,比如DMA内存域,高端内存域,普通内存域. 内核内存域的宏: enum zone_type { #ifdef CONF