为什么调用指针后给出错误的值

why after calling pointer gives wrong value

本文关键字:错误 出错 调用 指针 为什么      更新时间:2023-10-16
#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。

为什么?

int *add(int *a,int *b) 
{   
   int r;      // r resides on stack
   r=*a+*b;
   return &r;
} // life time of r ends here.

您返回的局部变量的地址会导致未定义的行为。编译器应该对此发出警告。

当你返回 r 的地址时,在 main 中,你有一个变量的地址,该变量在堆栈的当前"空闲"区域中。释放内存后使用内存,无论是"过时堆栈"还是"过时堆"都是"未定义的行为">

在这种情况下,将来在堆栈上使用r位置的任何使用都将用其他一些"随机"值覆盖r中的值。在这种情况下,它看起来像是函数add的地址(带有int参数(。

我还建议您使用更现代的编译器(在大多数国家/地区还不足以合法申请驾驶执照的编译器(并启用警告。例如GCC(它是自由软件,所以没有成本( - 它将给出"返回局部变量地址"的警告。

相关文章: