野指针:释放内存但却仍然使用它,将导致野指针

/************
野指针:释放内存但却仍然使用它,将导致野指针
*************/

/*
例子:输入一个不带空格的字符串显示在屏幕上
*/
#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;
}







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值