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

时间:2013-08-30 20:21:08

标签: c++ pointers

#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。

为什么呢?

2 个答案:

答案 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;的警告。