在C中交换Printf操作

时间:2015-09-12 13:39:40

标签: c

/*
    Can you interchange the execution order of the printf() statements?!
    Notes:
     - problem occurs in 32-bit Ubuntu 14.04
     - problem occurs in 64-bit Ubuntu 14.04
*/

#include <stdio.h>

int * addition(int a, int b) {
    int c = a + b;
    int *d = &c;
    return d;
}

int main(void) {
    int result = *(addition(1, 2));
    int *result_ptr = addition(1, 2);
    printf("result = %d\n", *result_ptr);
    printf("result = %d\n", result);
    return 0;
}

问题是交换线的顺序 printf("result = %d\n", *result_ptr);

printf("result = %d\n", result);

将导致不同的输出。但是当我在Ubuntu中编译并运行两个代码时,结果是相同的,两个输出都是3 3.问题是假设只在Ubuntu中发生。

1 个答案:

答案 0 :(得分:2)

两个版本都是未定义的行为,因为您返回本地分配的变量(c)的地址,这在技术上是堆栈上的地址。一旦函数退出,它就不再有效。所以问题本身是无效的,输出也可以是&#34;米老鼠&#34;。

编辑:从技术上讲,事实上你得到了预期的&#34;输出只是因为printf碰巧访问与addition函数相同的堆栈位置而中间没有发生清理。但这实际上只是偶然的#34;。