#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
int * add(int *, int *);
int add(int, int);
void main() {
int a, b, sum, *z;
cout << "enter the value of a & b";
cin >> a >> b;
z = add(&a, &b);
sum = add(a, b);
cout << "\nthe sum is: " << sum << endl;
cout << "the sum is :" << *z << endl; getch();
}
//.....calling with value.....
int add(int a, int b) {
int s;
s = a + b;
return s;
}
//......calling with address.......
int *add(int *a, int*b) {
int r;
r = *a + *b;
return &r;
}
为什么会给出错误的答案:
输出........ a = 70 b = 80与值之和为:150与地址的总和为:1208
...但是当我把程序作为:
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
int * add(int *, int *);
int add(int, int);
void main() {
int a, b, sum, *z;
cout << "enter the value of a & b";
cin >> a >> b;
sum = add(a, b);
cout << "\nthe sum is: " << sum << endl;
z = add(&a, &b);
cout << "the sum is :" << *z << endl;
getch();
}
//.....calling with value.....
int add(int a, int b) {
int s;
s = a + b;
return s;
}
//......calling with address.......
int *add(int *a, int*b) {
int r;
r = *a + *b;
return &r;
}
它给出了正确的答案。
输出..... a = 70 b = 80与值之和为:150与地址之和为:150。
为什么呢?
答案 0 :(得分:5)
int *add(int *a,int *b)
{
int r; // r resides on stack
r=*a+*b;
return &r;
} // life time of r ends here.
您将返回导致未定义行为的局部变量的地址。编译器应该警告它。
答案 1 :(得分:3)
当您返回r
的地址时,在main
中,您拥有堆栈中的变量的地址,在当前堆栈区域中#34; free&#34 ;。在释放后使用内存,是否过时堆栈&#34;陈旧堆栈&#34;或者&#34;陈旧的堆&#34;是&#34;未定义的行为&#34;
在这种情况下,将来在堆栈上使用r
的位置将覆盖r
中的值与其他一些&#34;随机&#34;值。在这种情况下,它看起来可能是函数add
的地址(带有int
参数)。
我还建议您使用更现代的编译器(在大多数国家/地区都不足以合法申请驾驶执照)并启用警告。例如GCC(这是免费软件,所以没有成本) - 它将给出&#34;返回本地变量的地址&#34;的警告。