/*
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中发生。
答案 0 :(得分:2)
两个版本都是未定义的行为,因为您返回本地分配的变量(c
)的地址,这在技术上是堆栈上的地址。一旦函数退出,它就不再有效。所以问题本身是无效的,输出也可以是&#34;米老鼠&#34;。
编辑:从技术上讲,事实上你得到了预期的&#34;输出只是因为printf
碰巧访问与addition
函数相同的堆栈位置而中间没有发生清理。但这实际上只是偶然的#34;。