【发布时间】:2015-09-08 15:54:59
【问题描述】:
我正在学习操作系统课程,我对以下代码有一些疑问
#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);
/*never interchange */
printf("result = %d\n", *result_ptr);
printf("result = %d\n", result);
return 0;
}
//this code outputs 3
3
这是我交换 printfs 时发生的情况,实际上第二个只是打印出一个随机地址
#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);
/*never interchange */
printf("result = %d\n", result);
printf("result = %d\n", *result_ptr);
return 0;
}
//this code outputs 3
and a random address
但是,如果我把它们做成一个 printf
#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);
/*never interchange */
printf("result = %d %d \n", result, *result_ptr);
return 0;
}
//this code outputs 3 3
不知道printf是不是清空了内存,所以指针变危险了?
【问题讨论】:
-
在'addition()'函数中,返回的指针指向栈上的一个变量。当函数退出时,该堆栈变量“超出范围”(因此不再有效并表现出可能导致段错误事件的未定义行为
-
此声明:
int result = *(addition(1,2));有效。这个声明:int *result_ptr = addition(1,2);现在有一个指向堆栈上“某处”的指针。某处不再有效(即取消引用该指针的未定义行为。 -
'printf()' 破坏了变量所在的堆栈,因为它实现了自己的堆栈值。
标签: c pointers operating-system printf