posts - 25,  comments - 36,  trackbacks - 0
#include <iostream>
#include 
<stdio.h>
using namespace std;

const MAXSIZE = 100;
typedef 
struct tagArray
{
    
int len;
    
int num[MAXSIZE];
}
Array;


int isMax(int n1,int n2)
{
    
switch(n1)
    
{
    
case '+':return 0;break;
    
case '-':return 0;break;
    
case '*':
        
if(n2 == '+'||n2 == '-')
            
return 1;
        
else
            
return 0;
        
break;
    
case '/':
        
if(n2 == '+'||n2 == '-')
            
return 1;
        
else
            
return 0;
        
break;
    
default:
        cout
<<"语法错误"<<endl;
        exit(
1);
        
break;
    }

}

int main()
{
    
/////////////////////
    int st[MAXSIZE] = {0};
    
int top = -1;
    
//简单的栈用于保存运算符
    /////////////////////
    Array ay;
    memset(
&ay,0,sizeof(ay));
    
//cout<<"大小是多少"<<ay.len<<endl;
    
//一个存放输去的缓冲
    ////////////////////////

    
int scr[] = {6,'*',4,'-',2,'+',5,'/',2};
    
const int len = 8;
    
int ErrorFlag = 0;
    
for(int i = 0; i < len; i++)
    

        
if(scr[i]=='+'||scr[i] == '-' || scr[i] == '*' || scr[i] == '/')
        
{
            
if(/*top == -1 ||*/ isMax(scr[i],st[top]))
            
{
                
//栈定元素级别比当前元素要小的时候 把当前运算符压入栈
                st[++top] = scr[i];
            }

            
else
            
{
                
//栈顶元素级别比当前元素要大的时候 栈顶元素弹出栈 输入到输出缓冲中去 并把当前元素符压入栈
                ay.num[ay.len++= st[top--]; //放到输出缓冲去
                st[++top] = scr[i];
            }

            
if(!ErrorFlag)
            
{
                cout
<< "-----------------------溢出发送错误-----------------"<<top<<endl;
                cout
<<scr[i]<<endl;//结果自己猜想真的 原来保存的是scr[i]的值 我靠
                
//估计原因是函数调用会保存参数变量的时候 一些溢出 真好产生这样会的错误
                
//这个懂汇编的话就可能很好解释了。。。。。。
                ErrorFlag = !ErrorFlag;
                
//这和/*top == -1 ||*/ 一结合 竟然把top 的值进行修改 我还是第一次真正的遇到这个问题
                
//数组的边界溢出导致出这样的问题。 有机会要好好研究一下溢出啊。
                
// 所以c语言的数组不够好,没有边界的检测 这样写大型程序时候程序出现异常
                
//st[-1] 地址其实top 的地址 。。
            }

        }

        
else
        
{
            
//是数字 输入到输出缓冲
                ay.num[ay.len++= scr[i];
                
//cout<<scr[i];
        }

    }

    
    
if(top==-1)
    
{
        cout
<<"非法数据"<<endl;
        exit(
1);
    }

    cout
<<"数组的大小"<<ay.len<<endl;
    cout
<<"top "<<top<<endl;
    
//把栈的元素全部输入缓冲去
    do 
    
{
        ay.num[ay.len
++= st[top--];
    }
 while (top!=-1);
    cout
<<"数组的大小"<<ay.len<<endl;
    
for(int k = 0; k < ay.len; k++)
    
{
        
if(ay.num[k] == '+'||ay.num[k] == '-'||ay.num[k] == '*'||ay.num[k] == '/')
        
{
            printf(
" %c",ay.num[k]);
        }

        
else
        
{
            cout
<<" "<<ay.num[k];
        }

    }

    
return 0;
}
posted on 2012-05-08 21:42 小鱼儿 阅读(1343) 评论(1)  编辑 收藏 引用

FeedBack:
# re: 无意间溢出修改变量值
2012-05-09 12:28 | 小鱼儿
@tb
这个小程序 没有写的很仔细。
捕捉异常就没有写。
导致开始运行的时候没有得到自己想要的结果。
通过调试发现原来是top 值不对。
然后仔细看代码,发现这个错误

感觉忒有意思耳溢出。。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2012年5月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(4)

随笔档案(25)

搜索

  •  

最新评论

阅读排行榜

评论排行榜