Null指针与MS-DOS不同,但是类似于新版本的Windows,现代的Linux系统会小心的处理读取或是写入由null指针所指向的地址,尽管实际的行为是实现相关的。
试验--访问Null指针下面我们在memory5a.c程序中试一下当我们访问一个null指针时会发生什么情况:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
char *some_memory = (char *)0;
printf(“A read from null %s\n”, some_memory);
sprintf(some_memory, “A write to null\n”);
exit(EXIT_SUCCESS);
}
其输出如下:
$ ./memory5a
A read from null (null)
Segmentation fault(core dumped)
工作原理第一个printf试图打印出由一个null指针处所取得的字符串;然后sprintf试图将一个字符串写入null指针处。在这种情况下,Linux(借助GNU C库)忽略了此处的读取,并且只是简单的返回给我们一个包含(null)\0字符的神奇字符串。但是他并没有忽略写入操作,并且结束了这个程序。这对于追踪程序bug是十分有用的。
如果我们再试一次,但是这次我们不使用GNU C库,我们就会发现由地址0处读取是不允许的。如下面的memory5b.c:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
char z = *(const char *)0;
printf(“I read from location zero\n”);
exit(EXIT_SUCCESS);
}
其输出如下:
$ ./memory5b
Segmentation fault(core dumped)
工作原理这一次我们试着直接由地址0处读取。但是这一次在我们与内核之间并不存在GNU libc库,但是我们程序被终止了。我们应该注意到某些版本的UNIX允许由地址0处读取,但是Linux并不允许这样做。
释放内存直到现在,我们只是简单的分配内存,然后希望当程序结束时,我们所用的内存并没有丢失。幸运的是Linux内存管理系统具有可靠的能力可以保证当一个程序结束时其所用的内存会返回给系统。然而,绝大多数的程序并不只是希望简单的分配某块内存,使用一段时间,然后退出。一个更为普遍的用法是在需要时动态使用。
动态使用内存的程序应总是使用free调用释放不再使用的内存,从而将这些内存返回malloc内存管理器。这会使得单独的内存进行重新合并,并且使得malloc库来管理内存,而不是使得程序来管理内存。如果一个运行的程序(进程)使用然后释放内存,释放的内存会保持分配给进程。然而,如果他不再被使用,Linux内存管理器就可以将其由物理内存中换出保存到交换空间中,这对于资源的使用有一些小的影响。
#include <stdlib.h>
void free(void *ptr_to memory);
free调用只可以使用由malloc,calloc或是realloc调用所获得的内存指针来进行调用。我们很快就会遇到calloc与realloc。
试验--释放内存此处程序名为memory6.c:
#include <stdlib.h>
#define ONE_K (1024)
int main()
{
char *some_memory;
int exit_code = EXIT_FAILURE;
some_memory = (char *)malloc(ONE_K);
if (some_memory != NULL) {
free(some_memory);
exit_code = EXIT_SUCCESS;
}
exit(exit_code);
}
工作原量这个程序只是简单的演示了如何使用前面已分配内存的指针调用free函数。
记住一旦我们在某一个内存块上调用了free函数,那么他就不再属性于这个进程。他也不再被malloc库所管理。不要在调用free函数之后试图在此内存块上执行读写操作。
其他的内存分配函数还有另外两个不如malloc与free这样经常使用的内存分配函数:calloc与realloc。其函数原型如下:
#include <stdlib.h>
void *calloc(size_t number_of_elements, size_t element_size);
void *realloc(void *existing_memory, size_t new_size);
尽管calloc分配的内存可以使用free函数调用来进行翻译,但是他却具有某些不同的参数:他为一个结构数据分配内存,并且需要元素个数以及每一个元素的尺寸作为其参数。分配的内存会使用0进行填充,如果calloc函数调用成功,则会返回一个指向第一个元素的指针。与malloc函数类似,其后的调用并不会返回连续的空间,所以我们不可能通过简单的再次调用calloc函数并且期望第二次调用所返回的内存添加到第一次调用的结束处,从而来扩大由calloc所分配的内存空间。
realloc会改变前一次分配的内存块的尺寸。调用此函数时会传递一个指向由malloc,calloc或是realloc函数所分配的内存的指针,并且根据要求调整其大小。realloc也许会需要能过移动数据来达到此目的,所以很重要的一点就是要保证一旦内存被重新分配了,我们必须使用新的指针,而不要试图使用realloc调用以前的指针来访问内存。
另一个需要关注的问题就是如果realloc不可以调整内存,他就会返回一个空指针。这就意味着,在某些程序中,我们应避免编写类似如下的代码:
my_ptr = malloc(BLOCK_SIZE);
....
my_ptr = realloc(my_ptr, BLOCK_SIZE * 10);
如果realloc函数调用失败,他就会返回一个空指针;my_ptr就会指向空;那么原始的由malloc所分配的内存就不可以使用my_ptr来访问了。很可能我们所需要做的是首先访问由malloc所分配的新内存,然后在翻译旧内存块之前使用memcpy函数将旧内存块的数据拷贝到新内存块。一旦出现错误,这可以使得程序重新访问存储在原始内存块中的数据,也许就是在执行程序清理的时候。
分享到:
相关推荐
### DAMA2数据管理知识体系解析 #### 一、数据管理的重要性及背景 在当今数字化时代,数据已经成为企业和组织的核心资产。随着技术的发展,我们能够测量各种事件和活动,从宇宙大爆炸的影响到人类的心跳,甚至能够...
二是为数据管理实践的实施提供功能框架;三是为数据管理概念建立通用词汇表。其中,数据管理职能包括数据治理、数据架构、数据建模和设计、数据存储和操作、数据安全、数据集成和互操作、文档和内容管理、参考数据...
DMBOK2.0是《数据管理知识体系指南》第二版的缩写,它是DAMA-DMBOK(Data Management Body of Knowledge)的更新和扩充版本。DMBOK2.0在第一版的基础上进行了大量的修订和扩展,以适应不断变化的数据管理和信息技术...
### 数据管理知识体系(第二版)—— DAMA-DMBOK #### 一、引言与背景 在当今数字化时代,数据已经成为企业运营的核心资产之一。随着云计算、大数据、人工智能等新兴技术的发展,数据管理的重要性日益凸显。企业...
数据中台之主数据管理 数据中台之主数据管理是指在数据中台中对主数据的统一管理和维护,确保主数据的唯一性、规范性和高效性。主数据管理的目标是统一数据标准和规范,确保主数据的权威性和可靠性,提高数据维护...
* 二级:非敏感重要数据,如公司系统数据、业务结果数据等,这些数据需要适当管理和保护,以免泄露造成一定的经济损失或影响业务运营。 三、责任部门 数据分类分级管理制度需要指定责任部门来负责数据的管理和保护...
数据管理职能包括由业务数据管理专员和技术数据管理专员共同承担的任务,其中业务数据管理专员主要负责企业数据资产的托管,而技术数据管理专员则作为资产的专家管理和监护人。有效的数据管理职能治理能够促进IT与...
第二维度:数据管理过程 ------------------------ * 级别1:无过程,数据管理混乱、无章法 * 级别2:初步过程,数据管理过程初步建立 * 级别3:标准过程,数据管理过程标准化 * 级别4:优化过程,数据管理过程不断...
DAMA(Data Management Association)数据管理知识体系是全球公认的数据管理专业标准,为数据管理专业人士提供了全面的理论框架和实践指导。这份名为"DAMA数据管理知识体系管理指南高清书籍及学习笔记试题"的资源包...
数据管理知识体系(DMBOK)是一种专业的数据管理职能框架,由DAMA国际提供,旨在规范化数据管理的最佳实践方法。该框架的最新版本为V3.0.2,涵盖了数据管理的各个方面,包括数据管理专业、数据管理知识体系、环境...
这里我们将深入探讨DMBOK2(第二版)中的2200个知识点以及DAMA DMBOK(数据管理协会数据管理知识体系),这些都是准备DAMA认证考试的关键资料。 首先,DMBOK2涵盖了数据管理的十大知识领域,包括:数据治理、数据...
二、数据资产管理活动职能 (一) 数据模型管理 (二) 数据标准管理 (三) 数据质量管理 (四) 主数据管理 (五) 数据安全管理 (六) 元数据管理 (七) 数据开发管理 (八) 数据资产流通 (九) 数据价值评估 (十) 数据资产运营...
二、数据管理的目标和原则 * 提高信息化水平和数据管理能力 * 规范数据管理和应用流程 * 树立和发挥数据的资产价值 三、数据管理体系建设 * 数据管理体系的总体方针 * 提供可用、可信数据,打造可靠的应用基础 * ...
首先,供应商主数据管理是SAP系统运行的基础,它涉及到公司采购的所有供应商信息,包括国内供应商、境外供应商以及各二级单位采购的供应商。这不仅涵盖了长期合作的合格供应商,还涵盖了因特殊需求而临时采购的供应...
#### 二、数据管理知识体系概述 **数据管理知识体系**(Data Management Body of Knowledge,简称DMBOK)是一套由DAMA International提供的知识体系框架,旨在帮助专业人士规范化数据管理的最佳实践。DMBOK覆盖了...
8. 报废设备数据管理:报废设备中的数据应备份后清除,废弃介质妥善处理,防止信息泄露。 9. 计算机病毒管理:设立专人负责防病毒工作,建立防治制度,定期检查和清除病毒。 10. 专用计算机管理:营业用计算机不得...
本文来自于微信公众号:数据工匠俱乐部,文章结合作者政务规划实践的经验,从数据管理体系和大数据中心建设二个视角,阐述了大数据背景下,政务数据架构的构建模式。在大数据时代,政务数据资产管理目标是简政放权。...
DAMA数据管理知识体系指南.pdf
资产治理旨在降低数据管理的成本并提高效率。具体措施包括: 1. 数据存储治理,形成闭环,确保数据的稳定性和可访问性。 2. 数据计算治理工具,通过工具赋能资产治理,提升治理效率。 3. 治理领域和方法策略,制定...