/************
野指针:释放内存但却仍然使用它,将导致野指针
*************/
/*
例子:输入一个不带空格的字符串显示在屏幕上
*/
#include<stdio.h>
char *GetStr(void)
{
char s[80];
scanf("%s",s);
//printf("s = %p\n",s); //打印返回前在栈上创建的内存首地址
return s;
}
int main()
{
char *ptr = NULL;
//printf("prt = %p\n",prt); //打印初始化为NULL后的指针变量的值
//printf("Input:");
ptr = GetStr();
//printf("prt = %p\n",prt); //打印函数返回后在栈上创建的内存的首地址
puts(ptr); //试图使用野指针
return 0;
}


/*
运行警告产生一个笑脸,
产生笑脸的原因:该符号为通信专用字符,如果只是用作显示,
系统会使用一个特定的图形来显示,这就是我们看到的笑脸。
是不可打印的字符,所以windows处理了下。这就是野指针
去掉注释的几行打印验证一下
*/

/*修改一下*/
#include <stdio.h>
void GetStr(char *s) //指针形参接收实参传过来的数组首地址
{
scanf("%s",s);
}
int main()
{
char s[80];
char *ptr = s; //指针初始化,指向数组s的首地址
GetStr(ptr);
puts(ptr);
return 0;
}

/******************************
所以一定要释放指针free()
***************************/
#include <stdio.h>
#include<stdlib.h>//不要忘记头文件引用
char *GetStr(char *s)
{
s = (char *)malloc(80); //申请动态分配内存
scanf("%s",s);
return s; //返回动态分配的内存的首地址
}
int main()
{
char *ptr = NULL;
ptr = GetStr(ptr); //使ptr指向动态分配的内存的首地址
puts(ptr);
free(ptr); //释放ptr指向动态分配的内存
return 0;
}
/*****或者还可以这样来写*****/
#include <stdio.h>
#include<stdlib.h>//不要忘记头文件引用
char *GetStr()
{
char *s = NULL;
s = (char *)malloc(80); //申请动态分配内存
scanf("%s",s);
return s; //返回动态分配的内存的首地址
}
int main()
{
char *ptr = NULL;
ptr = GetStr(); //使ptr指向动态分配的内存的首地址
puts(ptr);
free(ptr); //释放ptr指向动态分配的内存
return 0;
}

野指针:释放内存但却仍然使用它,将导致野指针
*************/
/*
例子:输入一个不带空格的字符串显示在屏幕上
*/
#include<stdio.h>
char *GetStr(void)
{
char s[80];
scanf("%s",s);
//printf("s = %p\n",s); //打印返回前在栈上创建的内存首地址
return s;
}
int main()
{
char *ptr = NULL;
//printf("prt = %p\n",prt); //打印初始化为NULL后的指针变量的值
//printf("Input:");
ptr = GetStr();
//printf("prt = %p\n",prt); //打印函数返回后在栈上创建的内存的首地址
puts(ptr); //试图使用野指针
return 0;
}
/*
运行警告产生一个笑脸,
产生笑脸的原因:该符号为通信专用字符,如果只是用作显示,
系统会使用一个特定的图形来显示,这就是我们看到的笑脸。
是不可打印的字符,所以windows处理了下。这就是野指针
去掉注释的几行打印验证一下
*/
/*修改一下*/
#include <stdio.h>
void GetStr(char *s) //指针形参接收实参传过来的数组首地址
{
scanf("%s",s);
}
int main()
{
char s[80];
char *ptr = s; //指针初始化,指向数组s的首地址
GetStr(ptr);
puts(ptr);
return 0;
}
/******************************
所以一定要释放指针free()
***************************/
#include <stdio.h>
#include<stdlib.h>//不要忘记头文件引用
char *GetStr(char *s)
{
s = (char *)malloc(80); //申请动态分配内存
scanf("%s",s);
return s; //返回动态分配的内存的首地址
}
int main()
{
char *ptr = NULL;
ptr = GetStr(ptr); //使ptr指向动态分配的内存的首地址
puts(ptr);
free(ptr); //释放ptr指向动态分配的内存
return 0;
}
/*****或者还可以这样来写*****/
#include <stdio.h>
#include<stdlib.h>//不要忘记头文件引用
char *GetStr()
{
char *s = NULL;
s = (char *)malloc(80); //申请动态分配内存
scanf("%s",s);
return s; //返回动态分配的内存的首地址
}
int main()
{
char *ptr = NULL;
ptr = GetStr(); //使ptr指向动态分配的内存的首地址
puts(ptr);
free(ptr); //释放ptr指向动态分配的内存
return 0;
}