关于内存访问与修改

这是前段时间看到的一段代码,之前一直找不到错在哪儿,经过一番调试和询问,终于找到了问题的关键

#include<stdio.h>

#include<string.h>


void fun(unsigned int a, unsigned int b, unsigned int *c)
{
*c = a + b;

}


int main()
{
unsigned char e = 200;
unsigned char f = 100;
unsigned char g = 0;
fun((unsigned int)e,(unsigned int)f,(unsigned int*)&g);
return 0;

}

程序运行的结果:程序崩溃。

经过调试后发现:函数调用并没有问题,return 0;之后函数就崩溃了。

这是为什么呢?

首先我们看函数的变量,这里把一个unsigned char 类型的变量地址强制转化为了unsigned int*,使该变量g暂时能够存放

unsigned int类型的数据(此时&g的存储情况为 2c 01 00)。然而当程序调用结束,到了栈的销毁阶段。

g的栈帧会首先被销毁,这时问题就来了。g是一个unsigned  char类型的数据,所以销毁的自然也就是unsigned char大小的空间,

此时2c被销毁了,而01 00 00依旧存在。这就相当于非法修改内存空间上的值了。所以程序崩溃了。

另外通过这段程序我还发现在vs平台上,创建的变量之间存在着一块保护空间,可以对该空间进行访问,但不可以对其进行修改。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值