内存操作经典问题

野指针
(1)指针变量中的值是非法的内存地址,进而形成野指针
(2)野指针不是NULL指针是指向不可用内存的地址的指针
(3)NULL指针并无危害,很好判断,也很好调试
(4)C语言中无法判断一个指针所保存的地址是否合法

野指针:
(1)除了保存变量地址的指针和malloc的指针,其他是野指针
(2)指针指向malloc申请的地址空间,通过free释放调后变成野指针

野指针的由来:
(1)局部指针变量没有被初始化
(2)指针所执行的变量在指针之前被销毁
(3)使用已经释放的指针
(4)进行了错误的指针运算
(5)进行了错误的强制类型转换 //将变量值强制转换为指针地址值

实例分析:野指针初探

#include <stdio.h>
#include <malloc.h>

int main()
{
    int* p1 = (int*)malloc(40);  //申请40字节内存空间
    int* p2 = (int*)1234567;  //野指针
    int i = 0;

    printf("%p\n",p1);
    for(i = 0; i < 40; i++)
    {
        *(p1 + i) = 40 - i;  //指针加1移动4个字节,超过申请的内存空间,内存越界,改写非法的内存地址,野指针
    }

    free(p1);  //野指针,free函数只负责释放指针指向的内存空间,但不负责将指针重置为NULL指针或者重置为任何的地址值
    p1 = NULL;  //必须将释放过后的野指针赋值为NULL
    printf("%p\n",p1);

    for(i = 0; i < 40; i++)
    {
        p1[i] = p2[i];  //使用已经释放的内存空间
    }

    return 0;
}

在这里插入图片描述

基本原则:
(1)绝不返回****局部变量和局部数组地址
(2)任何变量在定义后必须0初始化
(3)字符数组必须确认0结束符后才能成为字符串
(4)任何使用与内存相关的函数必须指定长度信息

实例分析:无处不在的野指针

#include <stdio.h>
#include <string.h>
#include <malloc.h>

struct Student
{
    char* name;
    int number;
};

char* func()
{
    char p[] = "I love you";
    return p;
}

void del(char* p)
{
    printf("%p\n", p);

    free(p);
}

int main()
{
    struct Student s;  //由于没有初始化,产生野指针
    char* p = func();  //产生了野指针

    strcpy(s.name, p);  //使用了野指针

    s.number = 99;

    p = (char*)malloc(5);

    strcpy(p, "I LOVE YOU");  //产生内存越界,本质是操作了野指针所指向的内存空间

    del(p);

    return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值