不理解为什么调用一级指针作函数参数时候,就不能把myp1 = NULL,

产生野指针原因的本质:指针变量和它所指内存空间变量是两个不同的概念。

解决办法:三步曲

1、定义指针时,把指针变量赋值成NULL

2、释放内存时,先判断指针变量是否为NULL

3、释放完内存后,把指针变量重新复制成NUL

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

//你上面分配内存,总得给释放掉 二级指针法

int  getMem_free(char **myp1)
{
char *tmp1 = NULL;

if (myp1==NULL)
{
return -1;
}
tmp1 = *myp1;
free(tmp1);//释放完指针变量 所致的内存空间
tmp1 = NULL;//把实参改成NULL
return 0;
}
//一级指针法
int  getMem_free0(char *myp1)
{

if (myp1 == NULL)
{
return -1;
}

free(myp1);//释放完指针变量 所致的内存空间
//不明白这里点
//myp1 = NULL;//???
return 0;
}
int  main0801()
{
int ret = 0;
char *p1 = NULL;
int len1 = 0;

char *p2 = NULL;
int len2 = 0;
ret =  getMem(&p1,&len1,&p2,&len2);
printf("p1:%s\n",p1);
printf("len1:%d\n", len1);
printf("p2:%s\n", p2);
printf("len2:%d\n", len2);
//getMem_free(&p1);//释放内存
//getMem_free(&p2);

getMem_free0(p1);//在被调用函数中,把p1所指向的内存给释放掉,但是实参p1不能被修改成NULL, 有野指针情况发生

getMem_free0(p2);

//发现就是因为上面 myp1 = NULL; 导致p1和p2产生野指针 打印就会出现乱码,不是很懂这里意思
printf("p1:%s\n", p1);
printf("len1:%d\n", len1);
printf("p2:%s\n", p2);
printf("len2:%d\n", len2);

system("pause");
return 0;
}

原文地址:https://www.cnblogs.com/LiuKan/p/8366917.html

时间: 2024-11-09 02:17:32

不理解为什么调用一级指针作函数参数时候,就不能把myp1 = NULL,的相关文章

指向结构体变量的指针作函数参数

 /********************* * 指向结构体变量的指针作函数参数 * ***********************/ #include<stdio.h> #include<string.h> struct student {  int num;  char name[20];  //char *name;    //若定义为指针则应与下面 stu.name = "jacob"; 配对使用,交叉使用则会报错                 //

[C++程序设计]用指向数组的指针作函数参数

1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 void output(int (*p)[4]); 7 int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; 8 output(a); 9 return 0; 10 } 11 12 void output(int (*p)[4]) 13 { 14 int i,j; 15 for(i = 0; i < 3; i ++) 1

结构体指针作函数参数(C# 调用C++ 的DLL)

1.C++结构体定义: #pragma pack(1) struct Person {     #define Count_favoriteNumbers 6      int id;      float favoriteNumbers[Count_favoriteNumbers]; }; #pragma pack()        // #pragma pack(1) end C++ 导出函数: #define DllExport extern "C" __declspec(dll

C++中用指向二维数组的指针作函数参数

举例说明: 函数声明:void Fun(int (*p)[4] ); void Fun(int (*p)[4] ) {  int i=0,j=0;  for(i=0;i<4;i++)   for(j=0;j<4;j++)      cout << *(*(p+i)+j) << endl;    } p是指向a[0]的指针,那么p+i就是指向a[i]的指针,*(p+i)就是指向a[i][0]的指针, 那么*(p+i)+j就是指向a[i][j]的指针,所以*(*(p+i)+

用指向函数的指针作函数参数

函数指针变量通常的用途之一,是把指针作为参数传递到其他函数. 调用函数指针的例子: int locateElem(LinearList *pL, ElemType e, int (*compare)(ElemType*, ElemType*)) 其中 compare 是函数指针名,(ElemType*, ElemType*)是函数指针的参数. 调用函数指针的例子: if ((*compare)(&e1, &e2) == 0) return i; 参数 &e1 和 &e2 是

编程题:指针变量作函数参数,将两个整数按由大到小的顺序输出。

分析:通过指针变量作函数参数,无需返回值和全局变量,主调函数就可以使用被调用函数改变的值. #include<stdio.h> void swap(int *p1,int *p2) { int p; p=*p1; *p1=*p2; *p2=p; } void main() { int a=3,b=4; int *ptr1,*ptr2; ptr1=&a;ptr2=&b; if(a<b) swap(ptr1,ptr2); printf("%d,%d\n",

c语言中二维数组作函数参数以及二维数组的理解

当二维数组作函数参数接受主调函数中的二维数组时,退化为一个指向数组的指针. 在此引用<c与指针>中的观点:作为函数 参数的多位数组名的穿递方式和一维数组名相同--实际传递的是个指向数组第一个元素的指针.但是,两者之间的区别在于, 多维数组的每个元素本身是另外一个数组,编译器需要知道它的维数,以便为函数形参的下标表达式进行求值.

[C++程序设计]用指针变量作函数参数接收数组地址

1 #include <iostream> 2 using namespace std; 3 4 void select_sort(int *p, int n) 5 { 6 int i, j, k; 7 for(i = 0; i < n - 1; i++) 8 { 9 for(j = i + 1; j < n; j++) 10 { 11 if(p[i] > p[j]) 12 { 13 k = p[i]; 14 p[i] = p[j]; 15 p[j] = k; 16 } 17

实参和形参指针做函数参数时,如何改变main函数变量的值

//对输入的两个整数按大小顺序输出 代码如下: #include<iostream> using namespace std; int main() { void swap(int *p1,int *p2); int *pointer_1,*pointer_2,a,b; cin>>a>>b; pointer_1=&a; pointer_2=&b; if(a<b)swap(pointer_1,pointer_2); cout<<"