c学习46-内存(野指针、垂悬指针)

基础

1. 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的),此时去解引用就是去访问了一个不确定的地址,所以结果是不可知的。
2. 垂悬指针(迷途指针),在指针被delete之后,此时指针被称为空悬指针或者垂悬指针,也叫迷途指针。

索引

1. 段错误:一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址、访问了系统保护的内存地址、访问了只读的内存地址等等情况。
2. 同一块内存释放两次,会造成内存错误,程序运行崩溃,显示“已放弃”字样。
3. 垂悬指针的测试

注意点:

1. 测试中,野指针可以“读”,不可以赋值,读不会段错误,赋值会段错误。
2. 测试发现,访问垂悬指针不发生段错误,甚至可以重新赋值,重新使用。可能是因为这一块内存还没有分配出去。
3. 内存释放后,数据会清除吗?测试,输出为空,说明数据清除了。
4. 测试发现“写野指针”(为野指针指向赋值)会出现段错误,读不会;而垂悬指针,可以正常使用没有报错。推测:可能是因为这一块内存还没有分配出去。

———————————————————————————————————————

1.  段错误,野指针

1.1 去“读”野指针,并没有段错误。

void test_26_02(){
    int *p;
    printf("*p=%d\n",*p);
    printf("p=%p\n",p);
}

输出结果:
    *p=-1991643855
    p=0x400650

1.2   野指针赋值,发生段错误。

void test_26_02(){
    int *p;
    printf("*p=%d\n",*p);
    printf("p=%p\n",p);
    *p =2;
    printf("*p=%d\n",*p);
    printf("p=%p\n",p);
}
输出结果:
    *p=-1991643855
    p=0x400650
    段错误

2.  同一块内存释放两次,会造成内存错误,程序运行崩溃,显示“...已放弃”。

2.1 代码

void test_26_02(){
    char *p = (char *)malloc(2);
    free(p);
    free(p);
}

2.2 执行结果

2.3 代码

void test_26_02(){
    int *p  = new int[1];
    delete []p;
    delete []p;
}

2.4 执行结果

3. 测试垂悬指针

void test_00_01(){
    char *p1 = new char[10];
    strcat(p1,"hello");
    printf("p1=%s\n",p1);
    printf("p1=%p\n",p1);
    delete []p1;//delete对象后,指针没置空,称为垂悬指针(迷途指针)
    printf("*p1=%c\n",*p1);//内存释放后,数据会清除吗?测试,输出为空
    printf("*****************\n");
    strcat(p1,"world");//内存释放后,指针还可以用吗,测试是可以的,地址还是原来的地址。
    printf("p1=%s\n",p1);
    *p1 = 'c';//指针还能使用
    printf("*****************\n");
    printf("p1=%s\n",p1);
    printf("*p1=%c\n",*p1);
    printf("p1=%p\n",p1);
    printf("*****************\n");
    *(p1+20) = 'h';//可以访问,其他的堆内内存吗,测试是可以的。
    printf("*(p1+20)=%c\n",*(p1+20));
}

3.1 测试垂悬指针 执行结果

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值