C语言中的指针和内存泄漏

C语言中的指针和内存泄漏,第1张

C语言中的指针和内存泄漏,第2张

对于任何使用C语言的人来说,如果问他们C语言的烦恼是什么,可能很多人都会回答是指针和内存泄漏。这些确实是消耗开发人员大部分调试时间的事情。对于一些开发人员来说,指针和内存泄漏似乎令人望而生畏,但是一旦您了解了指针及其相关内存操作的基础知识,它们就是C语言中的优秀工具。

本文将与您分享开发人员在开始使用指向程序的指针之前应该知道的秘密。本文的内容包括:

导致内存损坏的指针操作的类型
使用动态内存分配时必须考虑的检查点
导致内存泄漏的情况
如果您提前知道哪里可能出错,那么您可以小心地避免陷阱,并消除大多数与指针和内存相关的问题。
有什么可能出错呢?

可能会出现几种问题场景,这些场景可能会在构建完成后导致问题。在处理指针时,您可以使用本文中的信息来避免许多问题。

未初始化的内存

在这个例子中,p被分配了10个字节。这10个字节可能包含垃圾数据,如图1所示。

char * p = malloc(10);


图1。垃圾数据


如果一个代码段在赋值之前试图访问这个p,它可能会得到垃圾值,并且您的程序可能会有不可预知的行为。p可能有一个你的程序从来没有预料到的值。

好的做法是总是结合使用memset和malloc,或者使用calloc。

char * p = malloc(10);
memset(p,' [13] ',10);

现在,即使相同的代码段试图在分配p之前访问它,该代码段也可以正确地处理空值(理想情况下应该具有的值),然后它将具有正确的行为。

内存覆盖

由于p已经被分配了10个字节,如果一个代码片段试图向p写入一个11字节的值,该操作将自动从其他位置“吃掉”一个字节,而不会通知您。让我们假设指针Q代表这个内存。


图2。原Q内容

图3。q覆盖后的内容


这样一来,指针Q就会有意想不到的东西。即使你的模块编码得足够好,它也可能有不正确的行为,因为一个共存的模块执行一些内存操作。下面的示例代码片段也可以说明这种情况。

char * name =(char *)malloc(11);
//给name
memcpy ( p,name,11)赋值;//问题从这里开始

在本例中,memcpy操作试图向P写入11个字节,而P只分配了10个字节。

一个好的做法是,无论何时向指针写入值,都要确保交叉检查可用的字节数和写入的字节数。通常,memcpy函数将是用于此目的的检查点。

内存超出界限

内存的过度读取意味着读取的字节比应该读取的要多。这个问题不太严重,这里就不赘述了。下面的代码提供了一个示例。

char * ptr =(char *)malloc(10);
char name[20];
memcpy ( name,ptr,20);//问题从这里开始

在这个例子中,memcpy操作试图从ptr读取20个字节,但是后者只分配了10个字节。这也会导致不希望的输出。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C语言中的指针和内存泄漏

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情