【问题标题】:why after calling pointer gives wrong value [closed]为什么调用指针后给出错误的值[关闭]
【发布时间】:2013-09-03 15:42:32
【问题描述】:
#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。

为什么?

【问题讨论】:

  • 还请指出这两个程序之间的区别,这将有助于我们更好地理解您的问题。
  • 如果我们将 r 声明为全局变量,那么它在这两种情况下都可以工作。是的,请给出 2 个程序之间的区别

标签: c++ pointers


【解决方案1】:
int *add(int *a,int *b) 
{   
   int r;      // r resides on stack
   r=*a+*b;
   return &r;

} // life time of r ends here.

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

【讨论】:

    【解决方案2】:

    当您返回r 的地址时,在main 中,您有一个变量的地址,该地址位于堆栈上,位于当前“空闲”的堆栈区域中。释放后使用内存,无论是“陈旧的堆栈”还是“陈旧的堆”都是“未定义的行为”

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

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

    【讨论】:

      猜你喜欢
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      相关资源
      最近更新 更多