2012-01-16 51 views
-4

我正在代码块(只有编译器我有)编写此代码。当我遇到这样的行为。有人建议为什么这与ct发生,我错过了什么。为什么这种不确定性增值?

#include <stdio.h> 
int main(int argc,char* argv[]) 
{ 
    int lov[3][2]={0};   
    int ct=0; 
    char* art; 
    if(argc!=4) 
     return 1; 


    art=argv[1]; 
     do 
     { 
      if(*art=='L' & *(art+1)=='o' & *(art+2)=='c') 
      { 
       printf("\n\n (art+3)=%s ,*(art+3)=%c ,*(art+5)=%c",(art+3),*(art+3),*(art+5)); 
       lov[ct][ct]=*(art+3)-48; 
       lov[ct][ct+1]=*(art+5)-48; 
       printf("\nct=%d,lov[x][x]=%d,lov[x][x+1]=%d ",ct,lov[ct][ct],lov[ct][ct+1]); 
       ct++; 
      } 
      art+=3; 
     } 
     while(*(art++)); 
getchar(); 
} 

而就命令提示: -

>Resol.exe Loc2,5 Loc3,8 Loc5,4 
Output:- 


(art+3)=2,5 ,*(art+3)=2 ,*(art+5)=5 
ct=0,lov[x][x]=2,lov[x][x+1]=5 

(art+3)=3,8 ,*(art+3)=3 ,*(art+5)=8 
ct=1,lov[x][x]=3,lov[x][x+1]=8 

(art+3)=5,4 ,*(art+3)=5 ,*(art+5)=4 

CT = 5,LOV [X] [X] = 4198582

,LOV [X] [X + 1 ] = 4

为什么ct变为5(最后一行)

+2

你的代码访问'argv'在一个非常可疑的方式。考虑转换为'for'循环来访问'argv'。 – user7116 2012-01-16 17:06:55

+0

代码的用途是什么?对我来说,作为一个陌生人,它确实没有任何意义。 – 2012-01-16 17:11:01

回答

4

I t会出现ct被覆盖,因为您正在访问lov越界。您的编译器可能将ctlov彼此靠近堆栈,这就是为什么ct被错误修改的原因。

ct等于1你写信给lov[ct][ct+1],这是lov[1][2]。那是超出界限的。但下一次您写信给lov[2][2]lov[2][3],其中一个将导致对ct的修改。

当您编写lov[ct][ct+1]时,只能对ct == 0有效。 ct的所有其他值都会导致数组越界访问。

如果考虑到此代码的混淆性质,如果还有其他此类错误,我不会感到惊讶。

+0

完美的感谢.....好像堆栈被五个覆盖....非常感谢 – perilbrain 2012-01-16 17:09:30

+0

@ sepp2k即使'lov [1] [2]'仍然是越界,并会导致行为不符合预期。而且,正如我已经说过的那样,这将是'lov [2] [X]'访问修改'ct'。 – 2012-01-16 17:22:04

0

lov是尺寸为[3][2]的阵列。 ct5,所以lov[5][5]是超出界限的。没有保证你会得到什么。

+0

问题是为什么ct要5? – perilbrain 2012-01-16 17:06:03

2

您的代码有多个问题,C会按您说的去做。


之前取消引用指针这样的:

if(*art=='L' & *(art+1)=='o' & *(art+2)=='c') 

你应该检查他们是否是有效的,在所有的,即应先检查art长度。


你的格式字符串病:

printf("\n\n (art+3)=%s ,*(art+3)=%c ,*(art+5)=%c",(art+3),*(art+3),*(art+5)); 

即你正在使用的格式说明是这样的:

a) %s <- art+3 
b) %c <- *(art+3) 
c) %c <- *(art+5) 

一)这潜在的招数printf到阅读非法UND意外内存部分 - >未定义行为可能。

b)潜在的非法读取 - >未定义行为可能。

c)潜在的非法读取 - >未定义行为可能。


然后,

lov[ct][ct]=*(art+3)-48; 
lov[ct][ct+1]=*(art+5)-48; 

无处你把ct的限制,让你有资格盗采写作 - >未定义行为的邀请。


然后:

while(*(art++)); 

什么是art?你在哪里初始化它?你为什么增加它?


所有的一切:你可能注定你在点ct值,你貌似写lov

lov[ct][ct]=*(art+3)-48; 
lov[ct][ct+1]=*(art+5)-48; 
+1

谢谢...下一次我将发布3000行代码,包括所有缓冲区安全性,堆安全性和无论如何... – perilbrain 2012-01-16 17:21:02

+1

@peril脑:永远不会发布幻想代码。张贴实际的代码。你所显示的代码是坏的,错误的,并且有很多未定义的行为。如果你有检查和安全以及正确的代码(你暗示你为了例子而忽略了),错误就不会出现。 – 2012-01-17 10:02:13