这是前段时间看到的一段代码,之前一直找不到错在哪儿,经过一番调试和询问,终于找到了问题的关键
#include<stdio.h>
#include<string.h>
{
*c = a + b;
}
{
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平台上,创建的变量之间存在着一块保护空间,可以对该空间进行访问,但不可以对其进行修改。