程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> 無意間溢出修改變量值

無意間溢出修改變量值

編輯:關於C

#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;
}

 

作者 小魚兒

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved