讨论/算法和数据结构/c的逆波兰表达式的溢出/
c的逆波兰表达式的溢出

的逆波兰表达式的溢出

int evalRPN(char ** tokens, int tokensSize){  // 逆波兰表达式的求值;
        int *ovals ,top=-1 , i ,sum ,a,b;  
        ovals=(int *)malloc( (tokensSize+1) *sizeof(int));  //数字栈;
         for(i=0 ;i<tokensSize ;i++)
         {
                switch(tokens[i][0])  
                {

                      case '+':  
                             a=ovals[top--];
                             b=ovals[top--];
                             sum=b+a;
                             top++;
                             ovals[top]=sum;
                            break;
                case '-':      
                        if ( tokens[i][1]=='\0' ){  // 只有一个负号时; 
                             a=ovals[top--];
                             b=ovals[top--];
                             sum=b-a;
                             top++;
                             ovals[top]=sum;
                             break;
                             }
                        else 
                            break;       
                      case '*':
                             a=ovals[top--];
                             b=ovals[top--];
                             sum=b*a;
                             top++;
                             ovals[top]=sum;
                             break;  
                      case '/':
                             a=ovals[top--];
                             b=ovals[top--];
                             sum=b/a;
                             top++;
                             ovals[top]=sum;
                             break;
                        default:  
                        top++;
                        ovals[top] = atoi(tokens[i]);  //数字的转换  ,负数依然为负;    
                        break; 
                }
         } 
            return ovals[0];
}

在用例为 ["10","6","9","3","+","-11","","/","","17","+","5","+"],就回出现
AddressSanitizer: heap-buffer-overflow on address 0x60600000001c at pc 0x000000401e85 bp 0x7fff289c87d0 sp 0x7fff289c87c0
数组访问过界
改为



int evalRPN(char ** tokens, int tokensSize){  // 逆波兰表达式的求值;
        int *ovals ,top=-1 , i ,sum ,a,b;  
        ovals=(int *)malloc( (tokensSize+1) *sizeof(int));  //数字栈;
         for(i=0 ;i<tokensSize ;i++)
         {
                switch(tokens[i][0])  //  -11 二维指针;
                {

                      case '+':  
                             a=ovals[top--];
                             b=ovals[top--];
                             sum=b+a;
                             top++;
                             ovals[top]=sum;
                            break;
                      case '*':
                             a=ovals[top--];
                             b=ovals[top--];
                             sum=b*a;
                             top++;
                             ovals[top]=sum;
                             break;  
                      case '/':
                             a=ovals[top--];
                             b=ovals[top--];
                             sum=b/a;
                             top++;
                             ovals[top]=sum;
                             break;
                     case '-':      //为负数情况直接进入default;
                        if(tokens[i][0]=='-' && tokens[i][1]=='\0'){  // 只有一个负号时; 
                             a=ovals[top--];
                             b=ovals[top--];
                             sum=b-a;
                             top++;
                             ovals[top]=sum;
                             break;
                            }     
                        default:  
                        top++;
                        ovals[top] = atoi(tokens[i]);  //数字的转换  ,负数依然为负;    
                        break; 
                }
         } 
            return ovals[0];
}

题目 | 150 | 逆波兰表达式的求值| 中等|
第一个时 else break ;失效了,使它直接向下访问了吗 导致数组访问越界了 , 还是其它情况呢?;

展开讨论
共 1 个讨论

第一段代码负数走不到default,没有添加到ovals数组中,第二段代码没问题啊?

1