再回首(三):野指针产生原因及解决方案

来源:互联网 发布:不稳定排序算法有哪些 编辑:程序博客网 时间:2024/05/21 00:52
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<string.h>//野指针产生问题分析//指针变量和它所指内存空间变量是两个不同的概念//解决野指针的方案//1定义指针时 把指针变量赋值成null//2 释放内存时,先判断指针变量是否为null //3 释放内存完毕后,把指针变量重新赋值成null//void wild_pointertest(){char *p = NULL;p = (char *)malloc(100); //char p[100];strcpy(p, "abcdefg");if (p != NULL){free(p);p = NULL;}if (p != NULL){free(p);}system("pause");}char *getMem2(int count){char *tmp = NULL;tmp = (char *)malloc(count * sizeof(char)); //char tmp[100];return tmp;}//实参和形参是两个不同的概念void getMem3(int count, char *p){char *tmp = NULL;tmp = (char *)malloc(count * sizeof(char)); //char tmp[100];p = tmp; //在这个场景下,你给形参赋值了,没有给实参赋值 //直接修改实参没戏。。。。。。。 实参和形参是两个不同的概念//return tmp;}void getMem4(int count, char **p /*out*/){char *tmp = NULL;tmp = (char *)malloc(count * sizeof(char)); //char tmp[100];//p = tmp; //在这个场景下,你给形参赋值了,没有给实参赋值 //直接修改实参没戏。。。。。。。 实参和形参是两个不同的概念//间接的修改实参*p = tmp;//return tmp;}//函数调用的时候,这个场景修改不实参int FreeMem2(char *p){if (p == NULL){return -1;}if (p != NULL){free(p);p = NULL; //想把实参给改掉,你能修改吗? 修改不了实参。。。。。}return 0;}int FreeMem3(char **p){if (*p == NULL){return -1;}if (*p != NULL){free(*p);*p = NULL; //想把实参给改掉,二级指针可以修改一级指针的值。。。。。}return 0;}void main(){//wild_pointertest();//一个函数中创建和释放内存,没有实参和形参的传递  一般注意不会产生野指针char *myp = NULL;/*myp = getMem2(100);getMem3(100, myp);*///没有真正的改变传入的实参getMem4(100, &myp);//传入二级指针用来改变一级指针的值  可以真正的改变实参值strcpy(myp,"bbbbb");//做业务操作//此 50000/*FreeMem2(myp);FreeMem2(myp);*///没有真正的释放实参 FreeMem3(&myp);FreeMem3(&myp);system("pause");}

0 0
原创粉丝点击