代码之家  ›  专栏  ›  技术社区  ›  Eduardo

使用getchar()和-o3的奇怪行为

  •  0
  • Eduardo  · 技术社区  · 15 年前

    我有这两个功能

        void set_dram_channel_width(int channel_width){
          printf("one\n");
              getchar();
        }
    
    
        void set_dram_transaction_granularity(int cacheline_size){
          printf("two\n");
              getchar();
        }
        //output:
        one
        f //my keyboard input
        two
        one
        f  //keyboard input
        two
        one
        f  //keyboard input
        //No more calls
    

    然后我将函数更改为:

        void set_dram_channel_width(int channel_width){
          printf("one\n");
        }
    
    
        void set_dram_transaction_granularity(int cacheline_size){
          printf("two\n");
          getchar();
        }
        //output
        one
        two 
        f //keyboard input
        //No more calls 
    

    这两个函数都是由外部代码调用的,两个程序的代码是相同的,只需更改getChar()就可以得到这两个不同的输出。这是可能的,还是我的代码中有问题?

    谢谢

    这是我从gdb获得的输出**

    对于第一个代码

    (gdb) break mem-dram.c:374
    Breakpoint 1 at 0x71c810: file build/ALPHA_FS/mem/dramsim/mem-dram.c, line 374.
    (gdb) break mem-dram.c:381
    Breakpoint 2 at 0x71c7b0: file build/ALPHA_FS/mem/dramsim/mem-dram.c, line 381.
    (gdb) run -d ./tmp/MyBench2/ 
    one
    f
    [Switching to Thread 47368811512112 (LWP 17507)]
    
    Breakpoint 1, set_dram_channel_width (channel_width=64)
    (gdb) c
    Continuing.
    two
    one
    f
    
    Breakpoint 2, set_dram_transaction_granularity (cacheline_size=64)
    (gdb) c
    Continuing.
    
    Breakpoint 1, set_dram_channel_width (channel_width=8)
    374     void set_dram_channel_width(int channel_width){
    (gdb) c
    Continuing.
    two
    one
    f
    

    对于第二个代码

    (gdb) break mem-dram.c:374
    Breakpoint 1 at 0x71c7b6: file build/ALPHA_FS/mem/dramsim/mem-dram.c, line 374.
    (gdb) break mem-dram.c:380
    Breakpoint 2 at 0x71c7f0: file build/ALPHA_FS/mem/dramsim/mem-dram.c, line 380.
    (gdb) run
    one
    two
    f
    [Switching to Thread 46985688772912 (LWP 17801)]
    
    Breakpoint 1, set_dram_channel_width (channel_width=64)
    (gdb) c
    Continuing.
    
    Breakpoint 2, set_dram_transaction_granularity (cacheline_size=64)
    (gdb) c
    Continuing.
    
    Breakpoint 1, set_dram_channel_width (channel_width=8)
    (gdb) c
    Continuing.
    
    1 回复  |  直到 14 年前
        1
  •  5
  •   slim    15 年前

    因为你还没有提供外部代码?,这是一个猜测。

    while(some condition) {
        foo1();
        foo2();
    }
    
    • Foo1印刷品' one “然后等待一些输入。你打字 f[enter] '.
    • foo1消耗 f '.
    • foo2打印'two'然后消耗 [enter] (换行符)。
    • 然后你回到开始,一切又发生了。

    在第二个版本中,foo1()不再读取任何内容。

    所以:

    • Foo1印刷品'
    • Foo2印刷品' two “然后等待一些输入。你打字 f [进入]
    • foo2消耗 f '

    唯一剩下的问题是为什么它会在它停止的时候。为了帮你,我们得看看 (some condition) 事实上是。

    注意,打电话 getchar() 不保留结果(如 c = getchar(); )你有这样做的理由吗?

    一个有用的C习语是:

    (void) getchar(); 
    

    转换为void表示程序员知道他们正在放弃返回值。