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

本例中的printf语句是否调用未定义的行为?

  •  3
  • ryyker  · 技术社区  · 7 年前

    源自 this question
    鉴于第1行中的声明 main ,是第二个和第三个 printf

    struct my_structure {
        int i;
    };
    
    void main() {
        struct my_structure variable = {20};
        struct my_structure *p = &variable;
    
        printf("NUMBER: %d\n", p++->i);  
        printf("NUMBER: %d\n", p++->i);   
        printf("NUMBER: %d\n", p++->i);   
    }
    
    2 回复  |  直到 7 年前
        1
  •  4
  •   chux    7 年前

    在这种情况下,首先 printf()

    printf("NUMBER: %d\n", p++->i);  
    

    第二 p++ 未定义的行为 @Osiris ,因为它试图形成一个超过1次的指针 struct my_structure variable .

    代码的其余部分无关紧要。

    //                     vvv
    printf("NUMBER: %d\n", p++->i); 
    

    详情:第二个员额增加 p ). 由于增量和访问是UB,任何一个都会导致UB。

        2
  •  1
  •   Jean-François Fabre    7 年前

    p 使其指向一个元素,这与1个元素的数组没有什么不同。

    P 未定义行为

    要有效,您需要指向3个连续元素,如:

    struct my_structure variable[3];  // should be initialized too
    

    p++ 问题本身不是(指针指向无效位置,那又怎样?在大多数指针循环之后是这样的),事实上我们试图 p->i 出现问题的位置无效。