非常奇怪的C行为

Ale*_*dro -3 c c++

嗨,在下面的简单程序中发生了一些非常奇怪的事情.该程序采用2位数的ASCII数字,因为我只需要读取数字,"@"符号和"." 符号.并找出这个字节的ASCII符号是什么.

int main(int args, char* argv[])
{
 unsigned int ch;


char aux[256];

 strcpy(aux,argv[1]);

 char a[0];

 char buff[50];
 char result[512];
 int i=0;

 while(i lessThan strlen(argv[1]))
 {   
     a[0]=aux[i];
     a[1]=aux[i+1];
     a[2]='\0';
     ch = atoi(a);
      printf("el int:%d \n",ch);
      sprintf(buff,"%c",ch);

       printf("el char: %s \n", buff);
       i=i+2;
   }

 } 
Run Code Online (Sandbox Code Playgroud)

好的,这是有效的,并且在变量buff中以正确的方式打印所有ASCII符号.但是你可以看到我有一个char[]从未使用过的被叫结果.所以我删除它.当我再次运行程序时,我得到了不同的结果:O.由于某种原因,该程序不会读取'.' 字符了:(为什么????请有人解释我,我很害怕哈哈!

我的结果与变量结果声明:

 ./try3 494650526450

    el int:49

    el char: 1 

    el int:46 

    el char: . 

    el int:50 

    el char: 2 

    el int:52 

    el char: 4 

    el int:64 

    el char: @ 

    el int:50 

    el char: 2 
Run Code Online (Sandbox Code Playgroud)

我的结果与变量结果声明:

 ./try3 494650526450

    el int:49 

    el char: 1 

    el int:0 

    el char:  

    el int:50 

    el char: 2 

    el int:52 

    el char: 4 

    el int:64 

    el char: @ 

    el int:50 

    el char: 2 
Run Code Online (Sandbox Code Playgroud)

cni*_*tar 5

你使用的是零长度数组,一个GNU扩展.更改char a[0];char a[3];.声明另一个未使用的char数组会更改内存的布局,这就是它"工作"的原因.