C语言指针闲扯

来源:互联网 发布:南京三宝科技 知乎 编辑:程序博客网 时间:2024/06/08 06:56

        提到C语言,搞电子产品的大家肯定都知道,做底层开发可是少不了C的。C语言的精华就是指针啦,说白了就是物理内存地址,通过指针可以使得代码很精简,效率也高,特别是项目中用到很多结构体时。打个比方,一个结构体就把它当作一套房子吧,结构体里的各个变量就是房子里面的家具了,而这个结构体的指针就相当于这套房子的具体门牌号了。好了,当某人访问房子的时候,我只要告诉他地址,他接下来就自己找了呗,什么操作都行,很方便。当然,任何东西都是两面性的。指针也不例外,一来给我们带来了方便,但是也带来了危险,就说上面这个例子吧,可能发生盗窃行为,偷梁换柱,到时候真正的主人来了,发现面目全非,那就悲剧了。指针的操作是要很小心的,至少有几点得注意下。我就讲讲自己知道的,抛砖引玉罢了。

        1.不要操作空指针。道理很简单嘛,你叫别人到你家做客,结果告诉别人一个不存在的地址,你说气人不气人。人在愤怒失去理智的时候,可是什么事情都做得出来的哦,会发生意想不到的事情啊。所以在敲代码的时候,涉及到指针操作时都要搞下验证。if (NULL !=pointer),才进行操作,否则就要有相应的异常处理。

        2.用malloc动态分配的时候,要对应有释放free,不然就造成内存泄露了。现在地皮就这么多,占了个茅坑却不拉屎也是很气人的吧。说到这个内存释放,得分几种不同的情况。

           第一种:重新赋值。比如char *area = malloc(10),char *newarea = malloc(10),都分配了10个字节的内存大小,也就是说土豪一下子买了两套房。好了,有一天土豪又没事做了,搞了这样一把操作,area = newarea,把新房子门牌号装到老房子上去了,结果老房子这个时候就是傀儡了,完全成为新房子的影子,而自己本身藏的香车美女也就烟消云散啦。因此在写代码的时候要注意给指针赋值时,确保内存位置不会变为孤立的。

           第二种:名字不好取,姑且叫做父子关系吧。比如char *father = malloc(10),分配了10个字节的内存,经过一些操纵之后呢,father指向的内存里又存了某个*son指针,son当然也指向某块内存。这个时候就得有个先后顺序释放内存了,如果直接释放掉father,这个时候son已经找不动了,对应指向的那块内存也就成为黑呼了。现在是个拼爹的社会,没有老子罩着,儿子日子就不好过了。 

        3.未初始化的指针。比如我用malloc分配了一段内存,char *pointer = malloc(10),这个指针指向的内存里可能存在某些垃圾值,某个代码此时尝试访问它,程序可能就会有意想不到的效果。这就好比是买了套二手房,是吧,自己住进去之前总得打扫干净,该重新规划的规划,该重新设计的重新设计,然后自己才能舒舒服服地住进去,干什么都行是吧。因此良好的代码风格是结合使用malloc和memset,或者使用calloc。这样同样的代码尝试访问p,该段代码也能正确处理NULL情况。

        4.内存覆盖的问题。还是以char *pointer = malloc(10)为例子,明明pointer指向的内存只有10个字节的大小,可偏偏要向它写入11字节的东西,这问题严重了。明明自己买的房子只有100平,可偏偏把它当做120平来用,不够怎么办,那就得占用隔壁邻居的地啦,各种意想不到的冲突就来啦。所以要特别注意每当向指针写入值时,都要确保对可用字节数和所写入的字节数进行交叉核对。一般情况下,memcpy 函数将是用于此目的的检查点。

        5.内存读取越界。这个问题其实和第4点类似,都是一样的道理,房子多大就多大,不要瞎折腾。

        6.返回值的不正确处理。有时候,某些函数会返回对动态内存分配的指针,比如一个函数fun,返回10字节大小的内存,然后一个返回值类型为void的函数调用这个fun,然后没有任何的处理,这样也就造成了10个字节的内存泄露。

        好吧,就扯这么多自己的感悟,希望把这博客经营好,向大神们看齐。

  

         

0 0
原创粉丝点击