C 为什么颠倒printf()的顺序会产生不同的输出?

C 为什么颠倒printf()的顺序会产生不同的输出?,c,C,为什么呢?是因为printf()的一些内部实现吗 我已打开-Wall选项,但未显示任何警告。 谢谢你的回答!这是我关于stackoverflow的第一个问题 但为什么颠倒顺序会给出不同的答案呢?如果是由于返回局部变量的未定义行为,为什么第一个程序给出正确答案,而第二个程序不能给出正确答案,而唯一的区别是printf()的顺序?您返回的是一个指向局部变量的指针,该指针在函数退出后被释放(从而调用未定义的行为).在此函数中 printf(”result = %d\n”, result); print

为什么呢?是因为printf()的一些内部实现吗

我已打开-Wall选项,但未显示任何警告。

谢谢你的回答!这是我关于stackoverflow的第一个问题


但为什么颠倒顺序会给出不同的答案呢?如果是由于返回局部变量的未定义行为,为什么第一个程序给出正确答案,而第二个程序不能给出正确答案,而唯一的区别是printf()的顺序?

您返回的是一个指向局部变量的指针,该指针在函数退出后被释放(从而调用未定义的行为).

在此函数中

printf(”result = %d\n”, result);
printf(”result = %d\n”, ∗resultptr);
您正在从堆栈返回指向对象的指针。从函数返回后,返回的内存无效。访问该内存会导致未定义的行为

如果将函数更改为返回一个
int
,则一切正常

int ∗addition(int a, int b){
    int c = a + b ;   // Object on the stack
    int ∗d = &c ;     // d points to an object on the stack.
    return d ;
}

是的,因为通过返回局部变量的地址,并在函数返回后使用它,您将进入未定义行为的领域。不,这不是因为printf的内部实现。请打开、阅读并理解编译器警告。的可能重复。集中在C++上,但同样适用于C.计算机中可能的副本,代码可以由<代码> GCC -O main main .c>代码>编译,并给出答案“结果=3”和“*RESULTPPT==2”,是否互换最后两个代码> Prtff()< />代码的顺序。因此,我认为这取决于编译器。返回指向局部变量的指针不是问题。问题在于在调用函数中取消对该指针的引用。
int ∗addition(int a, int b){
    int c = a + b ;   // Object on the stack
    int ∗d = &c ;     // d points to an object on the stack.
    return d ;
}
int addition(int a, int b){
    return (a + b);
}

int main (void) {
   int result1 = addition(1, 2);
   int result2 = addition(2, 3);

   printf(”result = %d\n”, result1);
   printf(”result = %d\n”, result2);
   return 0 ;
}